Использование библиотеки классов C # в качестве приложения сервера COM + - PullRequest
3 голосов
/ 16 февраля 2009

Я создал библиотеку классов .NET в C # и открыл ее для COM. Он отлично работает в качестве встроенного COM-сервера. Однако я хочу использовать его как внешний COM-сервер для отдельного процесса.

Для этого я пытаюсь создать приложение COM +. Я создал пустое приложение COM + и добавил в него классы, реализованные в библиотеке классов. Когда я вызываю CoCreateInstance () для создания экземпляра класса, реализованного в библиотеке, суррогатный процесс COM + обнаруживает нарушение доступа и завершается (следующие аварийные дампы).

Требуются ли какие-либо специальные шаги для создания библиотеки классов, которая может использоваться как COM-сервер out-proc под 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
RPCRT4! 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

Ответы [ 2 ]

1 голос
/ 09 апреля 2009

Возможно, рассмотрим пример ServicedComponent в этом ответе:

Создание внепроцессного COM в C # /. Net?

0 голосов
/ 09 апреля 2009

Предлагаю вместо этого взглянуть на .Net Remoting.

...