C#:Type.GetType 在动态加载的程序集的 类 上为空
C# : Type.GetType is null on classes of dynamically loaded assemblies
这是我第一个关于堆栈溢出的问题。我试图寻找解决方案,但在任何地方都找不到一个或类似的解决方案。
我有一个 MVC 网站项目,它有不同的 DLL(插件),因为这些 DLL 不需要部署在所有环境中,所以我在 Global.asax 中的 Application_Start 上动态加载它们从一个文件夹中只部署我需要的每个环境。所以我不想在项目中引用它们,所以我可以为所有人构建一个。
我的问题是 Type.GetType("FullClassName, AssemblyName") 在这些插件中的对象上总是 returns 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.
}
这是我第一个关于堆栈溢出的问题。我试图寻找解决方案,但在任何地方都找不到一个或类似的解决方案。
我有一个 MVC 网站项目,它有不同的 DLL(插件),因为这些 DLL 不需要部署在所有环境中,所以我在 Global.asax 中的 Application_Start 上动态加载它们从一个文件夹中只部署我需要的每个环境。所以我不想在项目中引用它们,所以我可以为所有人构建一个。
我的问题是 Type.GetType("FullClassName, AssemblyName") 在这些插件中的对象上总是 returns 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.
}