11

Delphi(win32ネイティブ)アプリケーションからCOMを介して呼び出すac#アセンブリがあります。

これは、1台を除いて、テストしたすべてのマシンで機能します。

問題は、COMオブジェクトを作成しようとすると、Delphiアプリケーションが「クラスが登録されていません」と表示されることです。

さて、下のレジストリを見ると、HKEY_CLASSES_ROOT\DelphiToCSharp\CLSIDそこにリストされているGUIDは、AssemblyInfo.csのアセンブリGUIDと同じではありません。それは同じである必要があります-それはそれがインストールされている他のすべてのコンピュータで同じです。

を試しregasm /unregister delphitocsharp.dllましたが、レジストリキーが削除されます。次に、そうするとregasm delphitocsharp.dll、レジストリキーが返されますが、GUIDは以前と同じです(つまり、間違っています)。それでもDelphiは「クラスが登録されていません」と表示されます。

動作中のマシンのDelphiToCSharp.dllは、動作していないマシンのバージョンと同じです(md5で確認済み)。

私が考えることができるのは、古いバージョンのdllが以前に登録されていて、レガスムを混乱させているそのファイルの残りがまだ存在しているということだけです。

この問題を修正または少なくともさらに診断するにはどうすればよいですか?

4

3 に答える 3

12

AssemblyInfo の GUID は "Type-Library" GUID になり、通常は探しているものではありません。クラスにアクセスしようとしており、クラスの Guid 属性と ComVisible を定義する必要があると仮定します。例えば:

[Guid("00001111-2222-3333-4444-555566667777"), ComVisible(true)]    
public class MyCOMRegisteredClass

そうしないと、クラスは a) 登録されないか、b) アセンブリ レベルで COMVisible(true) を定義した場合、.NET が作成する GUID が割り当てられます。

于 2008-09-29T07:13:04.097 に答える
1

たぶん、どこかに古いバージョンのアセンブリがありますか? 多分GACで?Regasmはおそらくそれを拾い上げて使用しています。

于 2008-09-29T06:41:55.807 に答える
1

ほとんどの場合、システムのどこかに同じ (古いバージョンの) dll のコピーがあり、同じファイルのコピーをディスクで検索し、新しいコピーを登録する前にそれらを手動で削除 (バックアップ) します。

于 2008-09-29T07:02:06.057 に答える