以下を使用して、(ネイティブ コードから) COM オブジェクトを作成していますCoCreateInstance
。
const
CLASS_GP2010: TGUID = "{DC55D96D-2D44-4697-9165-25D790DD8593}";
hr = CoCreateInstance(CLASS_GP2010, nil, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IUnknown, out unk);
実際、私は Delphi を使用しています。つまり、ヘルパー関数を呼び出します。
CreateComObject(CLASS_GP2010);
ほとんどの場合、この関数は成功します。しかし、同じ実行可能ファイル、同じプロセスで、への呼び出しが次のように失敗することがあります。CoCreateInstance
Unspecified error (0x80004005 = E_FAIL)
関数を再度呼び出すと、成功する場合と失敗する場合があります。(明らかな)韻や理由はありません。
それは私のCOM dllではありません
これが私が作成した通常のCOM DLL であるOutputDebugString
場合DLL_ATTACH
、DllGetClassObject
.
残念ながら、これは COM dll ではありません。これは .NET アセンブリ dll です。また、COM サブシステムは単に myを「ロード」dll
するだけではありません。代わりに、COM は以下をロードするように指示されますmscoree.dll
。
HKEY_CLASSES_ROOT
CLSID
{DC55D96D-2D44-4697-9165-25D790DD8593}
InprocServer32
@default = mscoree.dll
そしてmscoree.dll
、必要な機能をエクスポートしGetClassObject
ます。私ではなく、mscoree.dll
戻ってきた人E_FAIL
もそうです。私の開発マシンでは障害が発生することはありませんが、顧客のマシンでは一貫して断続的に障害が発生します。
.NET ログを有効にするにはどうすればよいですか?
問題は、(有用なものではなく)mscoree.dll
戻ってくるものなので、問題が何であるかを教えてもらうにはどうすればよいですか?E_FAIL
たとえば、(COM オブジェクトを頻繁に使用する唯一の顧客であることに加えて) 障害を経験している唯一の顧客は、たまたま Windows XP を使用しているようです。おそらく、.NET フレームワーク (バージョン 4 より前) で、異なるバージョンの .NET ランタイムを同じプロセスにロードできないという既知のバグが発生している可能性があります。
これを行うと、CLR バージョンの依存関係が導入され、ホスト プロセスが期待する CLR バージョンと競合する可能性があります。
この障害モードは、COM ラッパーを使用する場合の MSDN の記事にも記載されています。を指定するオプションがありclrVersion
ます。
別のバージョンの CLR が既に読み込まれていて、指定されたバージョンをインプロセスで同時に読み込むことができる場合は、指定されたバージョンが読み込まれます。それ以外の場合は、読み込まれた CLR が使用されます。これにより、ロード障害が発生する可能性があります。
これがWindows XP または .NET Framework の以前のバージョンでの断続的なロード エラーの原因である場合、どうすれば にそのmscoree.dll
ことを教えてもらえますか?
原因が別の場合、どうすれば .NET にそれを教えてもらうことができますか?