将程序集加载到单独的AppDomain中,获取InvalidCastException

时间:2008-10-03 16:02:44

标签: c# .net

我正在尝试在单独的应用程序域中加载程序集,但遇到了一个非常奇怪的问题。这是一些代码:

    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以及关于它们的一些其他信息,并将它们存储在我正在处理的项目的数据库中。因此,如果我在单独的应用程序域中加载此程序集,我也可以加载其他应用程序域,然后卸载应用程序域。如果我只需要那些数据,那么在应用程序的持续时间内加载所有这些程序集都没有意义。

4 个答案:

答案 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)

查看 this article.

使用该文章中的代码,我得到了一个跨应用程序域对象。我用泛型抽象了一些东西并且有三个程序集。 (即1定义接口,1定义插件实现,主程序告诉泛型要加载什么。)原始文章代码很容易遵循。