[英]Is it possible to use Type.GetType with a dynamically loaded assembly?
[英]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.