Я пытаюсь заставить мое приложение C # 4.0 (VS2010) взаимодействовать с приложением C ++, используя COM и библиотеку ссылочных типов.
Все примеры, которые я видел, в основном использовали сторонние библиотекивключить элементы управления ActiveX или DLL, где вы можете просто добавить ссылку и создавать объекты.Я не могу создать какие-либо объекты напрямую (я получаю сообщение об ошибке об использовании интерфейса) и не могу найти ничего, что вернет интерфейс.
Это защищенная COM-библиотека для доступа к зашифрованной базе данных, для создания которой требуется пароль-пароль.
Я потратил много времени на это, чтобы в целом узнать, что нужно сделать.но также достаточно, чтобы понять, что это настолько неясно, что я не собираюсь выяснять это в разумные сроки.Самые близкие примеры, которые я нашел, являются очень абстрактными и недокументированными.Это может быть полезно для кого-то, кто понимает COM и рефлексию и очень хорошо взаимодействует, но его недостаточно для использования в качестве отправной точки моего опыта.Я чувствую месяцы, когда я не могу его назвать.
Приложение C ++ было построено в режиме выпуска с использованием VS2005, и .tlb был успешно добавлен в качестве ссылки на мое решение C # 2010.Приложение C ++ установлено на моей машине для разработки.
В браузере объектов я вижу открытый класс SecureRepositoryClass, член SecurityAgentLib, с методом GetPolicyValue (string, string, string), который я хочу вызвать.Это реализует ISecureRepository, который определил GetPolicyValue.
Я знаю, что что-то должно вернуть ссылку, которую я могу привести к ISecureRepository, а затем вызвать нужный мне метод.
Что я не могу понять, как это сделать, так это получить ссылку наэтот.Наш проект C ++ (написанный кем-то другим, к сожалению, я не являюсь разработчиком C ++) использует следующий код (с переменными, которые установлены в другом контексте)
HRESULT hr = CoGetClassObject(CLSID_SecureRuntimeAgent, CLSCTX_LOCAL_SERVER, NULL, IID_IClassFactory2, (void**) &pClf);
if ((SUCCEEDED(hr)))
{
CComBSTR bstrKey = (LPCTSTR)ProduceKey();
hr = pClf->CreateInstanceLic(NULL, NULL, IID_ISecureRuntimeAgent, bstrKey, (void**)&m_pIAPLI);
if ((!SUCCEEDED(hr)))
Я искал CreateInstanceLic, CoGetClassObject,и пытался найти эквиваленты C #.
Я пробовал несколько примеров, но, не понимая, что они означают, трудно адаптироваться к этой конкретной ситуации.
Я знаю, что у меняи что мне нужно, но не как туда добраться.