web-dev-qa-db-ja.com

「ファイルまたはアセンブリ「netstandard、Version = 2.0.0.0、...」をロードできませんでした。参照アセンブリを実行のためにロードしないでください

目標:.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を実行のためにロードできないのはなぜですか?

16

ロードしようとしている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

シナリオでこれらのバージョンのいずれかを使用してみてください。

12
Wes Haggard

セットする Copy Enbaleは、netstandard.dllプロパティでtrueになります。

  1. ソリューションエクスプローラーを開き、netstandard.dllを右クリックします。
  2. セットする Copy Enbale trueに。

enter image description here

5
Armaan

参照アセンブリを読み込むことはできません。

.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タイプをインスタンス化します。

3
José Pedro

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を使用する必要があります。

2
pavel.smolkin

ワオ。この「ロードできなかった... netstandard」エラーの原因を追跡するのに数時間費やしました。

私にとっての問題は、.NET Frameworkプロジェクト(.NET Frameworkと.NET Standardライブラリの両方を参照する)が.NET Framework 4.7.2で構築されており、それを展開して実行するシステムに4.7.2がないことでした。インストール済み。

同じ基本構造と参照を持つ非常に小さなコンソールプロジェクトをデプロイし、コマンドウィンドウで実行すると、ポップアップで.NET Framework 4.7.2が欠落しているという正しいエラーが最終的に明らかになりました。

この特定のエラーに苦労している場合は、必要な.NET Frameworkがインストールされていることを確認してください。

1
MikeZ

私にとって、次のことを解決しました。1-サーバーに最新の.Net Frameworkをインストールしました。 2-Windowsサーバーとローカルマシンを更新しました。 3-Nuget Packageを管理し、更新タブですべての参照を更新しました。

おそらく、ステップ3を実行するだけで問題を解決できます

0
VINICIUS SIN

NetStandard.Library 2.0.0.0をNuGetからインストールします。 .net framework 4.6.1から4.6.0にダウングレードすると

0
R Riteshk