regasm.exeがc#アセンブリを間違ったGUIDで登録するのはなぜですか?
質問
Delphi(win32ネイティブ)アプリケーションからCOMを介して呼び出すC#アセンブリがあります。
これは、1つを除いて、テストしたすべてのマシンで機能します。
問題は、Delphiアプリケーションが「クラスが登録されていません」を取得することです。 COMオブジェクトを作成しようとしたとき。
今、 HKEY_CLASSES_ROOT \ DelphiToCSharp \ CLSID
の下のレジストリを見ると、そこにリストされているGUIDはAssemblyInfo.csのアセンブリGuidと同じではありません。同じである必要があります-インストールされている他のすべてのコンピューターで同じです。
regasm / unregister delphitocsharp.dll
を試しましたが、レジストリキーが削除されました。その後、 regasm delphitocsharp.dll
を実行すると、レジストリキーが返されますが、GUIDは以前と同じ(つまり間違っている)であり、Delphiは引き続き「クラスが登録されていません」を取得します。
稼働中のマシン上のDelphiToCSharp.dllは、稼働していないマシン上のバージョンと同一(md5で検証済み)です。
考えられるのは、以前のバージョンのdllが以前に登録されていて、そのファイルの一部が残っており、regasmが混乱していることです。
この問題を修正または少なくともさらに診断するにはどうすればよいですか
解決
AssemblyInfoのGUIDは" Type-Library"になります。 GUIDと通常はあなたが探しているものではありません。クラスにアクセスしようとしていると仮定します。クラスのGuid属性とComVisibleを定義する必要があります。例:
[Guid("00001111-2222-3333-4444-555566667777"), ComVisible(true)]
public class MyCOMRegisteredClass
そうしない場合、クラスはa)登録されないか、b)アセンブリレベルでCOMVisible(true)を定義した場合、.NETが自動的に起動するGUIDが割り当てられます。
他のヒント
どこかに古いバージョンのアセンブリがありますか?たぶんGACに? Regasmはおそらくそれを取り上げて使用しています。
ほとんどの場合、システムのどこかに同じ(古いバージョン)dllのコピーがあり、同じファイルのコピーをディスクで検索し、新しいコピーを登録する前に手動で削除(バックアップ)します。