【发布时间】:2017-12-14 18:33:49
【问题描述】:
目标: 从 .NET 4.7 控制台应用程序中,使用带有 Assembly.GetType() 的反射,我尝试从 Assembly X 中提取 netstandard 2.0 类的类型。然后我想使用 Activator.CreateInstance() 创建此类型的实例。
我想要做什么: 然而,这个程序集 X 依赖于 netstandard 2.0。为了能够获取类型,必须将 netstandard 依赖项加载到 AppDomain 中。这就是为什么当 AppDomain 通过 AssemblyResolve 事件请求 netstandard 程序集时,我只需像这样加载 dll:
var netStandardDllPath = @"C:\Users\xxx\.nuget\packages\NETStandard.Library.2.0.0-preview1-25301-01\build\netstandard2.0\ref\netstandard.dll";
return Assembly.LoadFrom(netStandardDllPath);
哪个抛出:
System.BadImageFormatException: '无法加载文件或程序集 'file:///C:\Users\vincent.lerouvillois.nuget\packages\NETStandard.Library.2.0.0-preview1-25301-01\build\netstandard2.0\ref\netstandard.dll' 或其依赖项之一。不应加载引用程序集 执行。它们只能在 Reflection-only loader 中加载 语境。 (来自 HRESULT 的异常:0x80131058)'
内部异常:BadImageFormatException:无法加载引用 执行程序集。
我所知道的: 我知道他们希望我们使用 Assembly.ReflectionOnlyLoadFrom 加载 DLL。但是这样做会阻止我使用 Activator.CreateInstance() 实例化类型。见Microsoft official post
另外,我尝试在我的控制台应用程序中引用 Nuget 包 NETStandard.Library 2.0.0-preview1-25301-01 和 NETStandard.Library.NETFramework 2.0.0-preview1-25305-02,这样它就有了 netstandard 2.0 库引用,但它没有改变任何东西。
问题: 有谁会知道是否有正确的方法来加载该 dll 而不会出错,或者这是否是一个错误,或者其他?或者为什么这种dll无法加载执行?
【问题讨论】:
-
永远,永远不要加载参考程序集,它们只适合构建您的程序。这是错误的,因为您编写了 AssemblyResolve 事件处理程序,没有它应该可以正常工作。关键是让 CLR 找出包含该类型的真正运行时程序集,this workaround 也适用于 .NETCore。
标签: c# .net dll .net-assembly .net-standard