2017-07-10 45 views
6

目標のためにロードするべきではありません。Assembly.GetTypeとの反射を()を使用して、.NET 4.7コンソールアプリから 、私は国会Xからnetstandard 2.0クラスのタイプを抽出しようとしていますそして、私が欲しいですActivator.CreateInstance()を使用してこのTypeのインスタンスを作成します。は、netstandard、バージョン= 2.0.0.0「ファイルまたはアセンブリをロードできませんでした '...'。参照アセンブリが実行

私がやろうとしていること: しかし、このアセンブリXは、netstandard 2.0に依存しています。 Typeを取得できるようにするには、netstandard依存関係をAppDomainにロードする必要があります。

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を:「ファイルまたはアセンブリをロードできませんでしたAppDomainのは、に、AssemblyResolveイベントを通じてnetstandardアセンブリを要求しているとき、私は単純に、このようなDLLをロードする理由です 'file:/// C:\ Users \ vincent.lerouvillois.nuget \ packages \ NETStandard.Library.2.0.0 preview1-25301-01 \ build \ netstandard2.0 \ ref \ netstandard.dll' またはその依存関係。参照アセンブリは、実行のための ロードすべきではありません。彼らは唯一のリフレクション専用ローダー コンテキストでロードすることができます。 (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が実行のためにロードできないのですか?

+3

リファレンスアセンブリをロードすることは決してありません。これらのアセンブリは、プログラムのビルドにのみ適しています。これはAssemblyResolveイベントハンドラを記述したので間違っていました。キーは、CLRに、この型を含む実際のランタイムアセンブリを理解させることです。[この回避策](https://stackoverflow.com/a/19636730/17034)が.NETCoreでも機能します。 –

答えて

2

NETStandard 2.0.0-preview1は、net461およびnet47との互換性がありません。

しかしrealese .NETコア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); 

ためにすべてがOKです。

しかし、steel1にpreview1ライブラリをロードする必要がある場合は、net471の代わりにnetstandard2.0を使用する必要があります。

+0

netstandard.dllは.NET Coreアプリケーションのために使用しないように注意してください.Netstandard.dllを.NET Frameworkで実行しようとすると他の問題が発生する可能性があります。私の答えは、.NET Frameworkのバージョンを見つける場所を参照してください。 –

2

あなたは、参照アセンブリをロードすることはできません。

.NET標準はである必要があります。は.NET標準互換の実装で提供されるAPIのコレクションです。

参照アセンブリには契約のみが含まれています。これは実装が含まれていないことを意味します。ロードしようとしているアセンブリには、.NET Standard 2.0コントラクトが含まれています。

契約は次のようになります。https://github.com/dotnet/standard/blob/master/netstandard/ref/mscorlib.cs

EDIT:あなたは.NETの標準タイプをインスタンス化するActivator.CreateInstance()を使用するすべてのアセンブリをロードする必要はありませんので、の.NET Framework 4.7は、.NET標準2.0を実装しています。

2

ロードしようとしているnetstandard.dllは、他の人が指摘しているように.NET Frameworkで実行時にロードできない参照アセンブリです。しかし、その依存関係を解決する必要がある場合は、実行しようとしているフレームワークにマップするランタイムバージョンが必要になります。

.NET標準サポートでは、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

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

関連する問題