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

C#:Type.GetType在动态加载程序集的类上为null,c#,types,.net-assembly,appdomain,gettype,C#,Types,.net Assembly,Appdomain,Gettype,这是我第一个关于堆栈溢出的问题。我试图寻找解决方案,但在任何地方都找不到 我有一个MVC网站项目,它有不同的DLL(插件),由于这些DLL不需要在所有环境中部署,我将在应用程序上动态加载这些DLL,并从一个文件夹启动Global.asax,只在每个环境中部署我需要的。所以我不知道在项目中引用什么,所以我可以为所有人构建一个版本 我的问题是Type.GetType(“FullClassName,AssemblyName”)在这些插件中的对象上总是返回null 在应用程序启动时,我基本上加载一个程序

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

我有一个MVC网站项目,它有不同的DLL(插件),由于这些DLL不需要在所有环境中部署,我将在应用程序上动态加载这些DLL,并从一个文件夹启动Global.asax,只在每个环境中部署我需要的。所以我不知道在项目中引用什么,所以我可以为所有人构建一个版本

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

在应用程序启动时,我基本上加载一个程序集,将其注册到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.
    }

调试
GetType
最简单的方法是从您创建的对象中获取正确的类型名,这是一种常用的强类型方式,例如
typeof(Action).AssemblyQualifiedName
。是否确实正在加载程序集?我不得不说,您的方法有点混乱:)请注意,使用
LoadFrom
加载程序集,然后尝试加载具有相同标识的程序集会导致相当大的问题。为什么不坚持使用一个简单的
程序集。加载
并避免所有的
间隙安装
等?特别要注意上的备注部分。我很确定你正在做你不该做的事情:)@Luaan谢谢你的回复。你是对的,这让人困惑,因为我正在尝试这个阶段的一切。但主要的问题是:如何使本机Type.GetType()工作而不需要添加DLL(在我的例子中只是一个类库)作为网站中的引用?这就是我在本例中试图实现的目标。如前所述,在混合载荷和载荷时要格外小心;这会引起奇怪的虫子。关于这个问题:如果你知道了,回答你自己的问题是完全可以的,但是请将答案标记为已接受,这样人们就知道不要在上面花费时间。你真正需要的是
Assembly.Load
——这是最简单、最典型的用法。所有其他功能都适用于更复杂的场景,例如,当您需要同时加载同一程序集的多个版本时,或者当您管理多个应用程序域时。