39

以下を使用して、(ネイティブ コードから) 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_ATTACHDllGetClassObject.

残念ながら、これは 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 にそれを教えてもらうことができますか?

4

2 に答える 2

0

少なくとも、Visual Studio のデバッガーで実行すると、最初の例外をキャッチして洞察を得ることができる可能性があります。少なくとも、E_FAIL の原因となるエラーの種類を知りたいと考えています。デバッグ シンボルがなくても、これを実行できるはずです。

さらに、同じプロセスで複数の .NET VM をロードできない場合でも、App.config および .dll マニフェストを手動で操作することで、.dll を同じ .NET VM にロードできる場合があります。別のものに対してコンパイルされました。

最後に、アプリケーション イベントの下にある Windows イベント ビューアをチェックして、そこに何かが記録されているかどうかを確認します。

于 2013-08-07T23:45:59.257 に答える