我有一个从 C# 调用的 ATL COM exe。我将引用导入到 C# 中,一切正常,生成了 exe,我可以在其上调用函数。现在,我实例化了其中几个 COM 对象。偶尔其中一个会挂起。释放 COM 对象没有任何作用,因为它仍在运行。我无法终止该过程,因为然后我会丢失所有其他表现良好的对象。所以,
- 有没有办法真正杀死一个人?
- 有没有办法为每个请求的 com 对象启动一个 exe?
- 如果我的客户端意外退出,COM exe 永远不会被清理。有没有什么办法解决这一问题?
理想情况下,我将能够为每个对象实例启动一个 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;
}
}
}
编辑:看起来如果我可以将其设置为“单次使用”,一切都会按我的意愿工作。但是,我找不到在 VS 2008 中设置此选项的位置
编辑:在谷歌群组上找到答案
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);
}
};