.NETデスクトップアプリケーションがロードしたすべてのアセンブリを確認するにはどうすればよいですか?電話で顧客に問い合わせて、PCに搭載されているXYZのバージョンを確認できるように、それらをアバウトボックスに入れたいと思います。
管理されたアセンブリと管理されていないアセンブリの両方が表示されると便利です。リストが長くなることは承知していますが、インクリメンタルサーチを行う予定です。
.NETデスクトップアプリケーションがロードしたすべてのアセンブリを確認するにはどうすればよいですか?電話で顧客に問い合わせて、PCに搭載されているXYZのバージョンを確認できるように、それらをアバウトボックスに入れたいと思います。
管理されたアセンブリと管理されていないアセンブリの両方が表示されると便利です。リストが長くなることは承知していますが、インクリメンタルサーチを行う予定です。
using System;
using System.Reflection;
using System.Windows.Forms;
public class MyAppDomain
{
public static void Main(string[] args)
{
AppDomain ad = AppDomain.CurrentDomain;
Assembly[] loadedAssemblies = ad.GetAssemblies();
Console.WriteLine("Here are the assemblies loaded in this appdomain\n");
foreach(Assembly a in loadedAssemblies)
{
Console.WriteLine(a.FullName);
}
}
}
PowerShell のバージョン:
[System.AppDomain]::CurrentDomain.GetAssemblies()
それ、またはSystem.Reflection.Assembly.GetLoadedModules()のいずれか。
AppDomain.GetAssembliesは、現在のAppDomainのアセンブリのみを反復処理することに注意してください。アプリケーションが複数のAppDomainを持つ可能性があるため、必要な処理が実行される場合と実行されない場合があります。
AppDomain.CurrentDomain.GetAssemblies();
トリックを行うように見えます:)
アンマネージを含むすべての DLL では、EnumProcessModules をピンボークしてモジュール ハンドルを取得し、各ハンドルに対して GetModuleFileName を使用して名前を取得できます。
http://pinvoke.net/default.aspx/psapi.EnumProcessModulesおよびhttp://msdn.microsoft.com/en-us/library/ms683197(VS.85).aspxを参照してください(pinvoke.net には署名がありませんこのためですが、理解するのは簡単です)。
64ビットの場合、 EnumProcessModulesEx を使用する必要があります