2017-05-11 4 views
4

外部アプリケーションからロードするタイプのコンソールアプリケーションを.NETコアに移植します。 Type.GetType("typename, assemblyname")を使用する完全な.NET Frameworkでは、アセンブリが実行可能ファイルと同じフォルダにある場合に動作します。.net core 1.1:外部アセンブリからのType.GetTypeがnullを返します。

.NET Coreでは、ライブラリを配置する場所によってnullが返されます。

回避策として、私はSystem.Runtime.Loaderパッケージをインストールし、完全なパスからロードを強制するResolvingイベントにアタッチ:

AssemblyLoadContext.Default.Resolving += Default_Resolving; 
type = Type.GetType(value); 

デリゲートがある場合:

private static Assembly Default_Resolving(AssemblyLoadContext context, AssemblyName assembly) 
{ 
    return context.LoadFromAssemblyPath(Path.Combine(Directory.GetCurrentDirectory(), @"bin\Debug\netcoreapp1.1", $"{assembly.Name}.dll")); 
} 

質問は次のとおりです。 .NETコアは外部アセンブリをロードするときにどこを探しますか?

+0

あなただ質問はここで回答されていますhttp://stackoverflow.com/questions/37895278/how-to-load-assemblies-located-in-a-folder -in-net-core-console-app –

+0

はい、私は前にその質問を読んできましたが、私が学びたいのは、System.Runtime.Loaderパッケージをまったく使用しないと、 .GetType、.NETはアセンブリをどこで探しますか? – Farlop

+0

@Farlop:なぜあなたの呼び出しがうまくいかなかったのか、そして.net coreがどのようにアセンブリを探すのかを理解することは、2つの別々の質問をしていると思います。後者を別の質問で尋ねるのが理にかなっています。しかし、私はこの文書にあなたを指摘できます:https://github.com/dotnet/core-setup/blob/master/Documentation/design-docs/corehost.md –

答えて

2

これは私がうまくいく年月を要しました。動的ロードは、デフォルトで実行ディレクトリからのみ発生します。静的なロードはあなたのnugetパッケージのキャッシュ(これは.runtimeconfig.jsonと.deps.jsonのためのものです)にかなり入り込みますが、ターゲットのdllをリンクしていなければそこにはありません。

実際には現在のディレクトリからロードしたくない場合があります。おそらくdllをロードするのは危険な場所です。

あなたのロードパスを取得するには:System.IO.Path.GetDirectoryName(typeof(myclassname).GetTypeInfo().Assembly.Location)

+0

これは私が理解していないものです...私は実行ディレクトリ(bin \ Debug \ netcoreapp1.1またはbin \ Debug)にライブラリを手動でコピーしますが、読み込みに失敗します。イベントを使用してライブラリのフルパスを明示的に使用する場合にのみ動作します。 現在のディレクトリからの読み込みについて、アプリケーションはタイプが設定されているいくつかの設定ファイルを読み込み、そのタイプのインスタンスを作成します。この方法で、私はアプリを再利用して、すべての顧客のために特定のライブラリを開発するだけです。どのようにこれを改善するための任意のアイデア? – Farlop

関連する問題