私はC#から呼び出しているATL COM EXEを持っています。私はC#への参照をインポートし、すべて正常に動作し、exeが生成され、私はそれの関数を呼び出すことができます。今、これらのCOMオブジェクトのいくつかをインスタンス化します。時にはそれらの1つがハングアップします。 COMオブジェクトを解放すると、まだ実行中のため、何も実行されません。私はそのプロセスを殺すことはできません。なぜなら、ちょうどうまく動作している他のすべてのオブジェクトを失うからです。だから、C#でCOMオブジェクトを管理する
- 本当に1つだけを殺す方法はありますか?
- リクエストされた各COMオブジェクトに対して1つのexeを起動する方法はありますか?
- クライアントが予期せず終了した場合、COM EXEは決してクリーンアップされません。これを修正する方法はありますか?
理想的には、オブジェクトインスタンスごとに1つのCOM EXEを起動し、Process.Kill()を実行することができます。これらのオプションのいずれかはオプションですか?私がオブジェクトを作成するために使用するクラスは以下の通りです。この場合、RandomID()(人工的に)は返すのに非常に時間がかかります。また、別の言語でこれを行う方法がある場合は、私もそれを試してみてください。ありがとう。
public class MyComObject:IDisposable
{
private bool disposed = false;
MyMath test;
public MyComObject()
{
test = new MyMath();
}
public double GetRandomID()
{
if (test != null)
return test.RandomID();
else
return -1;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!this.disposed)
{
if (test != null)
Marshal.ReleaseComObject(test);
disposing = true;
}
}
}
EDIT:これを「シングルユース」に設定できるかどうかは、私が望むようにすべて動作します。しかし、私はどここのオプションは、VS 2008
EDITに設定する見つけることができません:オブジェクトがハングアップしたときに何が起こるGoogleグループ
class CMathServerModule : public CAtlExeModuleT<CMathServerModule>
{
public :
DECLARE_LIBID(LIBID_MathServerLib)
DECLARE_REGISTRY_APPID_RESOURCEID(IDR_MATHSERVER, "{2FA977F0-050C-4010-A09F-4FE6D75F3024}")
HRESULT RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags)
throw()
{
dwFlags = ((dwFlags & ~(REGCLS_MULTIPLEUSE | REGCLS_MULTI_SEPARATE)) |
REGCLS_SINGLEUSE);
return CAtlExeModuleT<CMathServerModule>::RegisterClassObjects(dwClsContext, dwFlags);
}
};
私はソースを制御しますが、COMオブジェクトが32ビットで、C#ホストが64ビットであるため、out-of-procを作成する必要があります。 – Steve
私は人工的にここでぶら下がりの動作を作成していますが、実際のコードもハングアップすることがあり、大きなプロジェクトなので、他の人にはそれを正しく(悲しいことに) – Steve