2017-11-05 7 views
1

私はどのようにruntime locates assembliesを見て、実際にロードするのではなく、Assembly.Loadによって見つけられたアセンブリのパスを取得する方法があるかどうか疑問に思っていますか?アセンブリをロードするのではなく、そのパスを取得するにはどうすればいいですか?

AssemblyDefinition.ReadAssemblyからMono.Cecilまでは、アセンブリに直接パスが必要であり、それ自身のためにそれを探すことを余儀なくされることはないためです。代わりに標準System.ReflectionMono.Cecilの機能を組み合わせたいと思います。

+0

「Assembly.Location」を試しましたか? – Dido

+0

それは動作しますが、アセンブリはアプリケーションドメインにロードされます。私はそれを避けたいです。 –

答えて

2

Mono.Cecilはアセンブリリゾルバを使用してアセンブリ名からAssemblyDefinitionを取得します。

AssemblyNameReference reference = AssemblyNameReference.Parse("Foo, Version=1.0.0.0"); 
DefaultAssemblyResolver resolver = new DefaultAssemblyResolver(); 
AssemblyDefinition foo = resolve.Resolve(reference); 
1

新しい回答

あなたがのAssemblyNameを使用することができるかもしれません。残念ながら、私は自分の開発マシンではないので、これをテストすることはできません。 AssemblyNameはAssembly.Load()のmscorlib実装で使用されます。

私はCoreCLRに潜入して、リゾルバがファイルを実際に探す場所を知ることができたかどうかを確認しましたが、失敗しました。これで問題が解決しない場合は、CLRにダイビングして回答を求めてください。私はFindAssemblyコール

var assemblyName = new AssemblyName("YourAssembly versionwhateveretc"); 
var path = new Uri(assemblyName.EscapedCodeBase).LocalPath; 

旧回答にそれを絞ら

があなたのためにReflectionOnlyLoading仕事をしていますか?

これにより、現在のAppDomainに完全にロードせずに、アセンブリのメタデータを検査したり操作したりすることができます。

+0

昨日試してみましたが、この例外があります: 'System.IO.FileLoadException:プリロードされていないため、アセンブリ 'System.Core、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b77a5c561934e089'への依存関係を解決できません。 ReflectionOnly APIを使用する場合、依存アセンブリはReflectionOnlyAssemblyResolveイベントを介してオンデマンドでプリロードまたはロードする必要があります。実際には複雑な複雑さのためにアセンブリを実際にロードすることは避けたいと思います。 –

+0

あなたの懸念のパフォーマンスは関連していますか、またはアセンブリをロードすると、何をしようとしているのかという問題が発生しますか? 新しいアプリドメインにパスを取得してから、アプリドメインを閉じます。 –

+0

良い質問です。私がやろうとしていることは、標準APIの代わりに 'Mono.Cecil'を使用するように、私が行っている言語のために.NET APIにインターフェースモジュールを書き直すことです。今私は、ちょうど4つのアセンブリで型をコンパイルするのが約0.6秒かかるという問題があります。これは非常識です。私は、標準リフレクションでアセンブリをロードするのにどれだけの時間がかかるかを測定するのには気にしませんでしたが、標準リフレクションに触れることを避けるためにできるだけ多く試しているinteropモジュールを書き直すことに決めました。 –

関連する問題