目标:
从一个.NET 4.7控制台应用程序,使用Assembly.GetType()的反射,我尝试从Assembly X中提取netstandard 2.0类的Type。然后,我想使用Activator.CreateInstance()创建此Type的实例。
我正在尝试做的事情:
但是,此程序集X依赖于netstandard 2.0。为了能够获得Type,必须将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);
哪个抛出:
我所知道的:
我知道他们希望我们使用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无法加载执行?
最佳答案
您尝试加载的netstandard.dll是一个引用程序集,无法像其他人指出的那样在.NET Framework上运行时加载该程序集。但是,如果您需要解决该依赖性,则需要映射到您要在其上运行的框架的运行时版本。
对于.NET Standard支持,我们将它们包含在VS附带的msbuild扩展中,因此您将需要从那里获取netstandard.dll的版本。根据所安装的VS2017版本的不同,它应该位于C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll
之类,或者从.NET Core 2.0 SDK中可以找到C:\Program Files\dotnet\sdk\2.0.0\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\netstandard.dll
尝试在您的方案中使用这些版本之一。