我正在尝试在单独的应用程序域中加载程序集,但遇到了一个非常奇怪的问题。这是一些代码:
public static void LoadAssembly(string assemblyPath)
{
string pathToDll = Assembly.GetCallingAssembly().CodeBase;
AppDomainSetup domainSetup = new AppDomainSetup
{
PrivateBinPath = pathToDll
};
AppDomain newDomain = AppDomain.CreateDomain("AssemblyLoader",null,domainSetup);
AssemblyLoader loader = (AssemblyLoader)newDomain.CreateInstanceFromAndUnwrap(
pathToDll,
typeof(AssemblyLoader).FullName);
}
AssemblyLoader是与此相同的程序集中的另一个类,它继承自MarshalByRef,但是由于某些奇怪的原因,每次我尝试运行它时都会得到一个强制转换异常。我甚至硬编码DLL的路径,而不是使用GetCallingAssembly()。CodeBase但我一直得到这个异常。
我知道很难回答这样的问题而没有真正看到它并获得更多信息,但也许有人遇到了类似的情况,并且会知道常见的“陷阱”以及我应该注意的事项。
编辑:我不想直接加载它的原因是因为这只是代码的一部分。最终目标是这个类将有一个方法来加载程序集,获取它们的GUID以及关于它们的一些其他信息,并将它们存储在我正在处理的项目的数据库中。因此,如果我在单独的应用程序域中加载此程序集,我也可以加载其他应用程序域,然后卸载应用程序域。如果我只需要那些数据,那么在应用程序的持续时间内加载所有这些程序集都没有意义。
答案 0 :(得分:2)
(编辑:阅读给出的例外情况后,完全更改答案)
看来问题是CreateInstanceFromAndUnwrap调用,它使用'pathToDll'的LoadFrom语义。 {3}}在她的博客上,您的原始AppDomain尝试调用Load(“SomeAssembly,[...]”)而不是LoadFrom(“pathToDll”)在尝试解析相关类型时。
她的建议是将当前域上的AssemblyResolve事件挂钩以执行正确的LoadFrom以获取类型。根据Suzanne的建议,一点针对性的谷歌搜索引出Suzanne Cook detailed the possible sticking point。
答案 1 :(得分:0)
我不相信PrivateBinPath配置是必要的,除了你不需要使用DLL的路径,而是使用程序集的第一个参数的完全限定名称;尝试:
AssemblyLoader loader = (AssemblyLoader)newDomain.CreateInstanceFromAndUnwrap(
typeof(AssemblyLoader).Assembly.FullName,
typeof(AssemblyLoader).FullName);
答案 2 :(得分:0)
您在这里尝试做的事情有很多很好的信息:How to load a .NET assembly for reflection operations and subsequently unload it?
答案 3 :(得分:0)
使用该文章中的代码,我得到了一个跨应用程序域对象。我用泛型抽象了一些东西并且有三个程序集。 (即1定义接口,1定义插件实现,主程序告诉泛型要加载什么。)原始文章代码很容易遵循。