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

时间:2018-05-31 12:12:50

标签: c# types .net-assembly appdomain gettype

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

我有一个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>

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

我明白了。我无法相信解决方案有多简单。在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.
    }