33

C# で記述された DLL ファイルがプログラムによって登録されているかどうかを調べるにはどうすればよいですか?

私はすでにこのコードを試しましたが、うまくいきません。

DLL ファイルを登録し、このコードを使用してチェックすると、返されます。登録を解除して同じコードを実行すると、再び true が返されます。引数として DLL ファイルのフルパスを指定しています。

Visual C++で単純な DLL ファイルを開発しました。その後、登録しました。ここで、登録されているかどうかを確認します。

ボブ、自分でコードを置き換えてくれませんか。私にはまだ難しいですか?

DLL ファイルを登録すると、レジストリにエントリが存在しますか? それらのエントリを見つけて、DLL ファイルが登録されているかどうかを判断しますか?

4

7 に答える 7

22

DLL で定義されている COM オブジェクトの GUID を調べる必要があります。次に、次のレジストリ キーを確認します。

HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}\InprocServer32

x を GUID に置き換えます。

DLL へのフル パスを含む既定値が必要です。

于 2009-03-27T10:10:39.953 に答える
5

GACに登録するという意味の場合、これが私の考慮事項です。GACに登録するには、アセンブリに厳密な名前で署名する必要があります(名前に公開鍵トークンが含まれている必要があります)。

Assembly.Load(string)したがって、取得した場合は、を使用してロードしてみることができますFileNotFoundException-アセンブリはGACに登録されていません。

エラーが発生しなかったが、結果Assembly.GetName().GetPublicKeyToken()がnullまたは空の場合-これは、GACではなくアプリケーションディレクトリでアセンブリが見つかったことを意味します。

于 2009-03-27T09:48:13.643 に答える
3

COM dll の CLSID がわかっている場合は、その CLSID を持つキーがあるかどうかを確認するだけですHKEY_CLASSES_ROOT\CLSID\{CLSID-of-your-COM-component}( HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{CLSID-of-your-COM-component}Wow6432Node => 64 ビット マシンに登録されている 32 ビット COM)

次に例を示します。

private bool IsAlreadyRegistered()
{
    using (var classesRootKey = Microsoft.Win32.RegistryKey.OpenBaseKey(
           Microsoft.Win32.RegistryHive.ClassesRoot, Microsoft.Win32.RegistryView.Default))
    {
        const string clsid = "{12345678-9012-3456-7890-123456789012}";

        var clsIdKey = classesRootKey.OpenSubKey(@"Wow6432Node\CLSID\" + clsid) ??
                        classesRootKey.OpenSubKey(@"CLSID\" + clsid);

        if (clsIdKey != null)
        {
            clsIdKey.Dispose();
            return true;
        }

        return false;
    }
}
于 2015-12-05T01:12:50.167 に答える
3

これを使用できます:

My.Computer.Registry.ClassesRoot.GetSubKeyNames.Contains("gEncrypt.clsEncrypt")

「gEncrypt.clsEncrypt」は ComName.ClassName です。

于 2011-06-01T16:12:34.110 に答える
2
class TestDll
{
    //Import your tested DLL here
    [DllImport("kernel32")]
    public extern static int LoadLibrary(string lpLibFileName);
}

try
{
    TestDll test = new TestDll();
}
catch(DllNotFoundException ex)
{
    return false;
}
于 2010-11-19T14:52:47.563 に答える
2
  1. インターフェイスへのポインターを宣言する
  2. CLSID と IID で CoCreateInstance を呼び出す
  3. 戻り値が S_OK でない場合、クラスは登録されていません
于 2009-03-27T09:40:39.947 に答える
1
[DllImport("kernel32")]    
public extern static bool FreeLibrary(int hLibModule);

[DllImport("kernel32")]    
public extern static int LoadLibrary(string lpLibFileName);



public bool IsDllRegistered(string DllName)    
{

      int libId = LoadLibrary(DllName);    
      if (libId>0) FreeLibrary(libId);    
      return (libId>0);    
}
于 2009-03-27T09:40:01.290 に答える