Размещение CLR в нативных интерфейсах COM, неразрешенный внешний символ _CStdStubBuffer_Release @ 4 - PullRequest
2 голосов
/ 26 ноября 2011

Я экспериментирую с хостингом CLR (пока не пытаюсь использовать моно, хотя, вероятно, попробую).По сути, я слежу за этим:

http://www.lenholgate.com/blog/2010/07/clr-hosting---a-flexible-managed-plugin-system-part-1.html

Однако у меня есть некоторые проблемы с самим COM, так как это не так подробно объясняется в этой статье, и я учусьпо ходу дела (раньше я не играл с COM).

Я определил интерфейс:

import "unknwn.idl";
[
    object,
    uuid(55d96f88-9633-4ad7-b9de-1a546ea73307),
    helpstring("INative interface"),
    pointer_default(unique)
]
interface INative : IUnknown
{
    HRESULT Write(BSTR s);
}
[
   object,
   uuid(74eeeaaa-d73c-436e-b52d-5c8a972ce60a),
   helpstring("ITestManager Interface"),
   pointer_default(unique)
]
interface IManagedHost : IUnknown
{
    HRESULT Init(INative* native);
}

И включил сгенерированные файлы в свой собственный проект.Однако я не могу собрать исполняемый файл, потому что компоновщик не может разрешить: _CStdStubBuffer_Release@4.RpcRT4.lib связан, но я запустил dumpbin rpcrt4.lib /all | grep _CStdStubBuffer_Release, и ничего такого, экспортируемого этой библиотекой, нет, есть CStdStubBuffer_DebugServerRelease.Итак, вопрос в том, что именно ссылается на этот метод, если он предположительно не должен существовать?

Было ли проведено еще какое-то исследование, и я обнаружил, что на этот метод ссылается файл .c, созданный инструментом IDL:

const CInterfaceStubVtbl _INativeStubVtbl =
{
    &IID_INative,
    &INative_ServerInfo,
    4,
    0, /* pure interpreted */
    CStdStubBuffer_METHODS
};

и CStdStubBuffer_METHODS определены в RpcProxy.h Windows SDK v7.0A:

#define CStdStubBuffer_METHODS \
    CStdStubBuffer_QueryInterface,\
    CStdStubBuffer_AddRef, \
    CStdStubBuffer_Release, \
    CStdStubBuffer_Connect, \
    CStdStubBuffer_Disconnect, \
    CStdStubBuffer_Invoke, \
    CStdStubBuffer_IsIIDSupported, \
    CStdStubBuffer_CountRefs, \
    CStdStubBuffer_DebugServerQueryInterface, \
    CStdStubBuffer_DebugServerRelease

, который действительно хочет, чтобы метод CStdStubBuffer_Release, хотя он немного отличается от: http://msdn.microsoft.com/en-us/library/windows/desktop/ms764247%28v=VS.85%29.aspx.

Какую другую библиотеку я должен связать тогда?

1 Ответ

3 голосов
/ 27 ноября 2011

CStdStubBuffer_Release () реализован с помощью другого файла, автоматически сгенерированного midl.exe, dlldata.c. Макрос DLLDATA_ROUTINES генерирует его.

Эта проблема указывает на ошибку конфигурации проекта, похоже, что вы добавили прокси-файл .c в свой основной проект вместо использования его в проекте прокси / заглушки. Который также потребляет dlldata.c. Я почти уверен, что для настраиваемого хоста CLR нет необходимости использовать прокси / заглушку, поэтому просто удалите файл .c.

...