【发布时间】:2012-12-08 19:48:40
【问题描述】:
我发现了很多类似的问题,但找不到任何解决方案。
我有以下代码:
string file = "c:\\abc.dll";
AppDomainSetup ads = new AppDomainSetup();
ads.PrivateBinPath = Path.GetDirectoryName(file);
AppDomain ad2 = AppDomain.CreateDomain("AD2", null, ads);
ProxyDomain proxy = (ProxyDomain)ad2.CreateInstanceAndUnwrap(typeof(ProxyDomain).Assembly.FullName, typeof(ProxyDomain).FullName);
Assembly asm = proxy.GetAssembly(file); // exception File.IO assembly not found is thrown here after succesfully running the funktion GetAssembly.
public class ProxyDomain : MarshalByRefObject
{
public Assembly GetAssembly(string assemblyPath)
{
try
{
Assembly asm = Assembly.LoadFile(assemblyPath);
//...asm is initialized correctly, I can see everything with debugger
return asm;
}
catch
{
return null;
}
}
}
最有趣的是,我的 GetAssembly 函数返回了一些其他类型,甚至是我的自定义可序列化类,一切都很好。有人知道我错过了什么吗?还是无法将加载的程序集返回到另一个域?
谢谢
【问题讨论】:
-
您为什么要尝试将
Assembly返回到父应用程序域?通常,可以避免这种情况,因此父应用程序域不必加载程序集,并且可以在子应用程序域卸载时将其卸载。 -
如果您解释了您试图通过此 ProxyDomain 类实现的目标,将会有所帮助。如果要将完整程序集返回到主域,为什么需要新的 AppDomain?
-
好吧,我的第一个 appdomain 中并不需要这个程序集。我在一个文件夹中有很多它们,我必须找到包含特殊类属性的程序集并返回一个 dll 名称列表。我需要第二个应用程序域,因为在应用程序重新启动之前无法删除在主应用程序域中加载的所有程序集。我解决了我的问题,但仍然知道为什么它会返回所有其他类型并且无法返回 Assembly。
标签: c# appdomain .net-assembly