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

C# 正在将程序集加载到单独的AppDomain中,获取InvalidCastException,c#,.net,C#,.net,我试图在一个单独的应用程序域中加载程序集,但遇到了一个非常奇怪的问题。下面是一些代码: public static void LoadAssembly(string assemblyPath) { string pathToDll = Assembly.GetCallingAssembly().CodeBase; AppDomainSetup domainSetup = new AppDomainSetup {

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

    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,但是由于某些奇怪的原因,每次尝试运行此程序时,我都会遇到强制转换异常。我甚至没有使用GetCallingAssembly(),而是对DLL的路径进行了硬编码。但我一直都会遇到这种异常

我明白,如果不亲眼看到并了解更多信息,就很难回答这样的问题,但也许有人遇到过类似的情况,会知道常见的“陷阱”以及我应该注意什么


编辑:我不想直接加载它的原因是因为这只是代码的一部分。最终的目标是这个类将有一个方法来加载程序集,获取它们的GUID和其他一些关于它们的信息,并将它们存储在我正在处理的项目的数据库中。因此,如果我在单独的应用程序域中加载此程序集,我也可以在那里加载其他程序集,然后卸载应用程序域。如果我只需要这些数据,那么在应用程序运行期间加载所有这些程序集是没有意义的。

我认为没有必要进行PrivateBinPath配置,除此之外,您不需要使用DLL的路径,而需要使用程序集的完全限定名作为第一个参数;尝试:

AssemblyLoader loader = (AssemblyLoader)newDomain.CreateInstanceFromAndUnwrap(
        typeof(AssemblyLoader).Assembly.FullName,
        typeof(AssemblyLoader).FullName);
(编辑:阅读给出的异常后,完全更改答案)

问题似乎是CreateInstanceFromAndUnwrap调用,该调用使用了“pathToDll”的LoadFrom语义。在她的博客上,您的原始AppDomain尝试调用Load(“SomeAssembly,[…]),而不是LoadFrom(“PathTodell”)来解析所讨论的类型


她的建议是钩住当前域上的AssemblyResolve事件,以执行正确的LoadFrom以获取类型。根据苏珊娜的建议,谷歌推出了一些有针对性的搜索。

这里有很多关于你要做什么的好信息:

请查看


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

如果AssemblyLoader类与此类位于同一程序集中,为什么要尝试从newDomain加载它?为什么不直接实例化它呢?这是间接加载插件的一种方式。如果加载程序实例位于主应用程序域中,则在外部应用程序域中创建一个版本,并要求它加载您感兴趣的插件。这就避免了你的插件需要知道它们是否能够被一个单独的应用程序域处理。(即从MarshallByRefObject派生)这使设计决策保持灵活(例如,创建一个插件基类,为插件提供所有共享功能。)不,这里是这样说的:无法将透明代理强制转换为类型“CompanyNamespaceTakenOut.AssemblyLoaderRong answer”。CreateInstanceFromAndUnwrap()的第一个参数是路径和文件名,而不是程序集名称。但是,CreateInstanceAndUnwrap()是一个程序集名称,但这对询问者没有帮助,因为它只能解析为相同的路径和文件名。