目標:.NET 4.7コンソールアプリから、Assembly.GetType()でリフレクションを使用して、アセンブリからnetstandard 2.0クラスのタイプを抽出しようとしています。 X.次に、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);
スローするもの:
System.BadImageFormatException: 'ファイルまたはアセンブリをロードできませんでした' file:/// C:\ Users\vincent.lerouvillois.nuget\packages\NETStandard.Library.2.0.0-preview1-25301-01\build\netstandard2.0\ref\netstandard.dll 'またはその依存関係の1つ。参照アセンブリを実行のためにロードしないでください。 Reflectionのみのローダーコンテキストでのみロードできます。 (HRESULTからの例外:0x80131058) '
内部例外:BadImageFormatException:実行のために参照アセンブリをロードできません。
私が知っていること:Assembly.ReflectionOnlyLoadFromでDLLをロードしてほしい。 Activator.CreateInstance()で型をインスタンス化しないようにします Microsoft公式投稿 を参照してください
また、コンソールアプリでNETStandard.Library 2.0.0-preview1-25301-01およびNETStandard.Library.NETFramework 2.0.0-preview1-25305-02のNugetパッケージを参照しようとしたため、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
シナリオでこれらのバージョンのいずれかを使用してみてください。
参照アセンブリを読み込むことはできません。
.NET標準は、.NET標準互換の実装によって提供される必要なAPIのコレクションです。
参照アセンブリには契約のみが含まれます。これは、実装が含まれていないことを意味します。ロードしようとしているアセンブリには、.NET Standard 2.0コントラクトが含まれています。
契約は次のようになります。 https://github.com/dotnet/standard/blob/master/netstandard/ref/mscorlib.cs
EDIT:.NET Framework 4.7は.NET Standard 2.0を実装しているため、Activator.CreateInstance()
を使用するためにアセンブリをロードする必要はありません。 .NET Standardタイプをインスタンス化します。
NETStandard 2.0.0-preview1はnet461およびnet47と互換性がありません。
しかし、実際の.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);
大丈夫。
ただし、preview1ライブラリを読み込む必要がある場合は、net471ではなくnetstandard2.0を使用する必要があります。
ワオ。この「ロードできなかった... netstandard」エラーの原因を追跡するのに数時間費やしました。
私にとっての問題は、.NET Frameworkプロジェクト(.NET Frameworkと.NET Standardライブラリの両方を参照する)が.NET Framework 4.7.2で構築されており、それを展開して実行するシステムに4.7.2がないことでした。インストール済み。
同じ基本構造と参照を持つ非常に小さなコンソールプロジェクトをデプロイし、コマンドウィンドウで実行すると、ポップアップで.NET Framework 4.7.2が欠落しているという正しいエラーが最終的に明らかになりました。
この特定のエラーに苦労している場合は、必要な.NET Frameworkがインストールされていることを確認してください。
私にとって、次のことを解決しました。1-サーバーに最新の.Net Frameworkをインストールしました。 2-Windowsサーバーとローカルマシンを更新しました。 3-Nuget Packageを管理し、更新タブですべての参照を更新しました。
おそらく、ステップ3を実行するだけで問題を解決できます
NetStandard.Library 2.0.0.0をNuGetからインストールします。 .net framework 4.6.1から4.6.0にダウングレードすると