2009-02-16 84 views
3

我在C#中創建了一個.NET類庫,並將它暴露給COM。它可以很好地用作進程內COM服務器。不過,我想用它作爲一個out-proc COM服務器來使它在一個單獨的進程中。使用C#類庫作爲COM +服務器應用程序

爲此,我嘗試創建一個COM +應用程序。我創建了一個空的COM +應用程序,並將類庫中實現的類添加到其中。當我調用CoCreateInstance()來實例化在庫中實現的類時,COM +代理程序會遇到訪問衝突並終止(崩潰轉儲清除)。

是否需要採取特殊措施來創建可在COM +下用作COM服務器的類庫?

的COM +代理進程崩潰,並顯示以下崩潰轉儲:

例外:C0000005
地址:0x000C1618

調用堆棧:
! + 0xC1618
mscorwks!Ordinal79 + 0xE41C
mscorwks!Ordinal79 + 0xE4AD
mscorwks!CoInitializeEE + 0x563F
mscorwks!CoInitializeEE + 0x5672
mscorwks!CoInitializeEE + 0x57F1
mscorwks!CoInitializeCor + 0x210E
mscorwks!CoInitializeCor + 0x48D
mscorwks!Ordinal79 + 0x16D2
mscorwks!ReleaseFusionInterfaces + 0x20B28
COMSVCS! + 0xC29A2
COMSVCS! + 0xC2BDA
COMSVCS!CoCreateStdTrustable + 0xCB10
OLE32!CoMarshalInterface + 0x2642
OLE32!CoInstall + 0x673
OLE32!CoQueryAuthenticationServices + 0x1F44
OLE32!CoQueryAuthenticationServices + 0x2862
OLE32!CoWaitForMultipleHandles + 0xC267
OLE32!CoQueryClientBlanket + 0x16CE
OLE32!CoCreateObjectInContext + 0xC8E
OLE32!CoInstall + 0x87A
OLE32!CoWaitForMultipleHandles + 0x10479
OLE32!CoMarshalInterface + 0x2808
OLE32!CoGetTreatAsClass + 0xBE7
OLE32!CoGetTreatAsClass + 0xB9E
OLE32!CoMarshalInterface + 0x28F2
OLE32!CoMarshalInterface + 0x2642
COMSVCS!CoCreateStdTrustable + 0x106A4
OLE32!CoMarshalInterface + 0x2642
OLE32!CoPopServiceDomain + 0x14FE
RPCRT4!CheckVerificationTrailer + 0x70
RPCRT4!NdrStubCall2 + 0x215
喀同盟T4!CStdStubBuffer_Invoke +爲0x82
OLE32!StgGetIFillLockBytesOnFile + 0xFC92
OLE32!StgGetIFillLockBytesOnFile + 0xFC3C
OLE32!CoRevokeClassObject + 0xA3E
OLE32!CoRevokeClassObject + 0x963
OLE32!StgGetIFillLockBytesOnFile + 0xF872
OLE32!WdtpInterfacePointer_UserMarshal + 0x80E
OLE32!StgGetIFillLockBytesOnFile + 0xF792
RPCRT4!NdrGetTypeFlags + 0x1C9
RPCRT4!NdrGetTypeFlags + 0x12E
RPCRT4!NdrGetTypeFlags + 0x5A
RPCRT4!CreateStubFromTypeInfo + 0x2D7
RPCRT4!CreateStubFromTypeInfo + 0x318
RPCRT4!NdrConformantArrayFree + 0x2CB
RPCRT4!NdrConformantArrayFree + 0x20F
RPCRT4!I_RpcBCacheFree + 0x61C
RPCRT4!I_RpcBCacheFree + 0x43E
RPCRT4!I_RpcBCacheFree + 0x604
KERNEL32!GetModuleFileNameA + 0x1B4

回答

0

我建議你看一看。淨遠程代替。

+1

這會不會讓我從非託管C++代碼使用C#類庫? – sharptooth 2009-04-09 14:06:00

1

也許會通過這個答案的ServicedComponent的例子可以幫助:

Create Out-Of-Process COM in C#/.Net?

+0

如果我將它作爲一個服務組件,我是否也可以使用相同的類庫作爲進程內COM服務器? – sharptooth 2009-04-13 04:18:45