내가있는 샌드 박스에 모듈을로드하는 데 사용하고 응용 프로그램 도메인이 : 나중에 다음내 C# AppDomain이 한순간에 훌륭한 이유는 무엇입니까? 다음에 예외가 발생합니다.
class PluginLoader
{
public static AppDomain PluginSandbox;
static PluginLoader()
{
AppDomainSetup ads = new AppDomainSetup();
ads.ApplicationName = "Plugin Modules";
PermissionSet trustedLoadFromRemoteSourceGrantSet =
new PermissionSet(PermissionState.Unrestricted);
PluginSandbox =
AppDomain.CreateDomain("Plugin App Domain",
null, ads, trustedLoadFromRemoteSourceGrantSet);
}
와, 내가 필요로하는 DLL에 끌어와 개체 인스턴스 생성 할 것이다 :
public IPlugin FindPlugin(string pluginName)
{
ObjectHandle handle =
PluginSandbox.CreateInstance(pluginName,
"Plugins." + pluginName);
IPlugin ip = (IPlugin)handle.Unwrap();
return ip;
}
을
문제없이이 과정을 몇 차례 통과했습니다. 샌드 박스에서 다양한 객체의 인스턴스를 아무런 문제없이 가져옵니다.
나중에 코드에서 다른 방법으로, 어셈블리를 찾아서 임베디드 리소스 (ManifestResource를 사용하여 데이터 파일로 컴파일 됨)를 가져와야합니다.
Assembly [] ar = PluginSandbox.GetAssemblies();
을 그리고 오류가 발생됩니다 : 그래서 내가 전화
A first chance exception of type 'System.IO.FileNotFoundException'
occurred in PluginRunner.dll.
Additional information: Could not load file or assembly '10wl4qso,
Version=1.0.3826.25439, culture info=neutral, PublicKeyToken=null'
or one of its dependencies. The system cannot find the file specified.
놀랐 아니에요. '10wl4qso'는 어셈블리, dll 또는 그와 유사한 것의 이름이 아닙니다. 실제로 각 실행에 대해 의사 무작위로 보입니다. 게다가 GetAssemblies
의 추가 된 재미는이 예외를 던지기 위해 문서화되어 있지 않습니다.
이제 초기 객체를 얻은 후에 GetAssemblies
을 호출 할 수 있습니다. 모든 것이 복숭아입니다. 그러나 몇 초 후, 다른 방법으로 이것을 얻습니다. PluginSandbox는 원격으로 사용되기 때문에 디버거에서 유용한 정보가 전혀 없습니다.
AppDomain에서 UnhandledException 및 DomainUnload를 catch하고 있는데 둘 다 트리거되지 않습니다.
내 AppDomain이 갑자기 어셈블리에 대해 알지 못하는 이유는 무엇입니까? 가비지 데이터의 출처는 어디입니까? 둘 중 하나 또는 둘 다 발생하지 않도록하려면 어떻게해야합니까?
나는 모습을하고 시리얼 라이저는 원격 프록시에서 사용 할 수있는 것을 제외하고 사용하지 않아도 - 그 내되지 않습니다 . 하나를 찾았음에도 불구하고 여전히 내 AppDomain이 휴지통으로 바뀌는 이유에 대한 설명으로 이것을 구입하지 않습니다. –
컴파일 된 정규 표현식을 사용하는 경우에도 이상한 이름의 어셈블리가 발생합니다. – Sean