리플렉션을 사용하여 플러그인의 함수를 호출하는 플러그인 시스템을 만들었습니다. 플러그인은 사용할 IPlugin 인터페이스를 구현해야합니다. 플러그인 인스턴스가 다음 코드로 생성 된 플러그인을 사용하는 응용 프로그램에서 : 좀 unmannaged DLL의 사용하는 플러그인을 만들었습니다리플렉션을 사용하여 dll 함수를 호출 할 때 보호 된 메모리를 읽거나 쓰려고 시도했습니다.
Assembly currentAssembly = Assembly.LoadFrom(startInfo.PluginAssemblyPath);
Type[] types = currentAssembly.GetTypes();
IPlugin pluginInstance = null;
foreach (Type type in types)
{
if (type.FullName == startInfo.PluginTypeName)
{
pluginInstance = (IPlugin)Activator.CreateInstance(type);
}
}
if (pluginInstance == null)
{
throw new Exception("Plugin loader error: Could not instantiate plugin: " + startInfo.ToString()); }
return pluginInstance;
. 테스트 솔루션에서 IPlugin 인터페이스 함수를 호출하면 모든 것이 잘 동작합니다. 그러나 위의 코드에서 만든 플러그인 인스턴스를 통해 플러그인을 호출 할 때 System.AccessViolationException이 발생합니다. unmannaged dll에서 함수를 호출 할 때 보호 된 메모리 오류를 읽거나 쓰려고 시도했습니다.
unmannaged dll은 제 3 자에 의해 만들어진 C++ dll입니다. 네이티브 코드 디버깅을 사용하려고했지만 .pdb 파일이 없습니다.
왜 이런 일이 발생했는지 나는 잘 모르겠습니다. 반성 때문입니까? 아니면 다른 원인이있을 수 있습니까?
편집 : 나는 unmannaged 기능을 볼 수있는 스택에서 가 호출되는 다음 _xLib 함수를 호출 할 때
[MarshalAs(UnmanagedType.LPStr)]
private readonly StringBuilder sb = new StringBuilder(256);
[DllImport("x.dll", EntryPoint = "xLib")]
static extern int _xLib(int a1, int a2, int a3, int a4, int a5, int a6, [Out]StringBuilder str);
예외가 발생합니다.
편집 :이 _xLib의 어딘가에는 다음 함수를 호출 기능 : 타 DLL에 다음과 같이 정의된다
handle = x_Open();
: 핸들에 아무것도 즉시
DllExport x_Handle *x_Open();
입니다 다음과 같이 사용 :
"%s", handle->x.string
예외가 발생합니다. 여전히 테스트 프로젝트에서 작동하는 이유를 이해하지 못하고 플러그인으로 앱에서 사용할 때가 아닙니다.
적어도 스택 추적을 제공하십시오. 호출중인 원시 함수의 이름. – leppie
물론 디버거가 필요합니다. 프로젝트 + 속성, 디버그 탭에서 "네이티브 코드 디버깅 사용"옵션을 선택합니다. –
@Hans Passant 그랬지만 디버거에는 가지고 있지 않은 .pdb 파일이 필요합니다. –