Vin*_*ois 18 .net c# dll .net-assembly .net-standard
目标: 从.NET 4.7控制台应用程序,使用Assembly.GetType()的反射,我尝试从程序集X中提取netstandard 2.0类的类型.然后我想用Activator.CreateInstance()创建此类型的实例.
我想要做的是: 但是,这个程序集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);
Run Code Online (Sandbox Code Playgroud)
哪个投掷:
System.BadImageFormatException:'无法加载文件或程序集'文件:/// 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官方帖子
另外,我尝试在我的控制台应用程序中引用Nuget软件包NETStandard.Library 2.0.0-preview1-25301-01和NETStandard.Library.NETFramework 2.0.0-preview1-25305-02,这样它就会引用netstandard 2.0库,但是它没有改变任何东西.
问题: 有没有人知道是否有正确的方法来加载该DLL而没有错误,或者可能是否是一个错误,或者?或者为什么这种DLL无法加载执行?
Wes*_*ard 13
您尝试加载的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
尝试在您的方案中使用其中一个版本.
哇。我只是花了几个小时来跟踪这个“无法加载...... netstandard”错误的原因。
对我来说,问题是我的 .NET Framework 项目(同时引用 .NET Framework 和 .NET Standard 库)是用 .NET Framework 4.7.2 构建的,而我部署和运行它的系统没有 4.7.2安装。
部署一个非常小的控制台项目,具有相同的基本结构和引用,并在命令窗口中执行,最终发现了正确的错误,在弹出窗口中,缺少 .NET Framework 4.7.2。
如果您正在为这个特定错误而苦苦挣扎,请确保您已安装必要的 .NET Framework。
NETStandard 2.0.0-preview1 与 net461 和 net47 不兼容。
但对于 realese .NET Core SDK 2.0 程序集(以及 2.0.0-preview2)
var netStandardDllPath = @"c:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.netcore.app\2.0.0\ref\netcoreapp2.0\netstandard.dll";
Console.WriteLine(Assembly.LoadFrom(netStandardDllPath).FullName);
Run Code Online (Sandbox Code Playgroud)
一切都好。
但如果您需要加载preview1库,也许您应该使用netstandard2.0而不是net471。
| 归档时间: |
|
| 查看次数: |
25791 次 |
| 最近记录: |