繁体   English   中英

C#:Type.GetType 在动态加载的程序集类上为 null

[英]C# : Type.GetType is null on classes of dynamically loaded assemblies

这是我关于堆栈溢出的第一个问题。 我试图寻找一种解决方案,但在任何地方都找不到一个或类似的解决方案。

我有一个 MVC 网站项目,它具有不同的 DLL(插件),并且由于不需要在所有环境中部署这些 DLL,因此我在 Global.asax 中的 Application_Start 上从文件夹动态加载这些 DLL,并仅部署每个环境所需的内容. 所以我不知道在项目中引用它们的内容,所以我可以为所有人构建一个。

我的问题是 Type.GetType("FullClassName, AssemblyName") 总是在这些插件中的对象上返回 null。

在 Application_Start 上,我基本上加载一个程序集,将它注册到 GAC,将它加载到当前的 AppDomain,初始化它的元数据并运行它的引导程序,并通过反射在全局 Unity 容器中注册组件。

foreach (string file in fileList) {
    string fileName = (Path.GetFileName(file));
    Assembly asm = Assembly.LoadFrom(file);

    foreach (Type assemblyType in asm.GetTypes()) {
        new System.EnterpriseServices.Internal.Publish().GacInstall(file);
        AppDomain.CurrentDomain.Load(asm.GetName());
        MetaDataHelper.InitialiseMetadataForAssembly(asm);
        IBootstrapper bootsrapper = (IBootstrapper)Activator.CreateInstance(assemblyType, container);
        bootsrapper.Initialise();                                    
    }
}

我还通过强命名我的程序集并将它们添加到 web.config 中尝试了这种方法,但无济于事。

<dependentAssembly>
    <assemblyIdentity name="MyAssembly"  culture="neutral" publicKeyToken="123456789"/>
        <codeBase version="1.0.1524.23149" href="FILE://C:/Myassemblies/MyAssembly2.dll"/>
    </dependentAssembly>

任何人都可以帮助我请问我错过了什么吗?

提前致谢。

我想到了。 我无法相信解决方案是多么简单。 在 AppDomain.CurrentDomain 和一些 MSDN 文档中进行了一些探索之后,我只需要实现并将自定义程序集解析事件处理程序添加到当前域。

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(currentDomain_AssemblyResolve);


 static Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
        --args.Name is the assembly name passed to the GetType("FullClassName,AssemblyName");
        --Search in LoadedAssemblies by name and return it.
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM