Доступ к C# .NET CORE DLL, подвергнутую COM от C ++C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Доступ к C# .NET CORE DLL, подвергнутую COM от C ++

Сообщение Anonymous »

Мне нужно иметь возможность получить доступ к C# .net (Core) DLL, записанного в VSCODE из C ++. < /p>
Я обнаружил, что .net не создает файл TLB при составлении C c # dll подвергся воздействию ком. Один из советов в статье Microsoft «Разоблачить компоненты .NET Core для com» - это написать файл IDL, который можно затем собрать с Midl в Tlb. < /P>
Документация на этой странице также ссылается на пример текста проекта comseverdemo, который я успешно работал. Чтобы иметь возможность получить доступ к comserver.dll, созданному этим проектом Comseverdemo, и попытаться получить доступ к нему из C ++.
Класс сервера в Comserverdemo определяется как:

Код: Выделить всё

using System;
using System.Runtime.InteropServices;

namespace COMServer
{
[ComVisible(true)]
[Guid(ContractGuids.ServerClass)]
public class Server : IServer
{
double IServer.ComputePi()
{
double sum = 0.0;
int sign = 1;
for (int i = 0; i < 1024; ++i)
{
sum += sign / (2.0 * i + 1.0);
sign *= -1;
}

return 4.0 * sum;
}
}
}
Мне не удалось найти много примеров простых файлов IDL, но мне удалось собрать это, возможно, неверно вместе, которые успешно компилируются с Midl в TLB:
[
uuid(b5bfbf8c-bebc-4eaa-8efc-a96d770a874b),
version(1.0),
]
library COMServer
{
importlib("stdole2.tlb");

[object, uuid(DB1797F5-7198-4411-8563-D05F4E904956)]
interface IServer : IUnknown {
double ComputePi();
};
};
< /code>
Я также попробовал 'BA9AC84B-C7FC-41CF-8B2F-1764EB773D4B' ', который является GUID интерфейсом сервера, но это также делает это, когда попытка получить доступ к C ++. /p>
Я нашел два примера, которые показали, как использовать TLB и получить доступ к DLL из C ++, который я изменил на костюм, один из них: < /p>
#import "COMServer.tlb"
using namespace COMServer;
CoInitialize(nullptr);

IServerPtr pServerPtr(__uuidof(IServer));
std::cout ComputePi()
, а другое: < /p>
#import "COMServer.tlb"
using namespace COMServer;
CoInitialize(nullptr);

COMServer::IServerPtr pServerPtr;
HRESULT hRes = pServerPtr.CreateInstance(__uuidof(COMServer::IServer));
std::cout ComputePi()
В обоих случаях pserverptr, по -видимому, является нулевым, а «e_pointer неверный указатель». Исключение происходит при попытке запустить функцию Computepi. Четкий рабочий пример того, как написать файл IDL для примера Microsoft ComserverDemo, может быть хорошей отправной точкой для других, а также для меня о том, как это сделать, тем более что статья Microsoft рекомендует это, но затем пропускает по этому поводу.

Подробнее здесь: https://stackoverflow.com/questions/794 ... com-from-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»