Zugriff auf eine C# .NET -Kern -DLL, die COM aus C ++ ausgesetzt istC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Zugriff auf eine C# .NET -Kern -DLL, die COM aus C ++ ausgesetzt ist

Post by Anonymous »

Ich muss in der Lage sein, auf eine C# .NET (CORE) -DLL zugreifen zu können, die in VSCODE von C ++ geschrieben wurde. # DLL aus Com ausgesetzt. Einer der Ratschläge in Microsofts Artikel "Expose .NET-Kernkomponenten für COM" unter Learn.microsoft.com/en-us/dotnet/core/native-interop/exponscomponents-to-com ist das Schreiben einer IDL Datei, die dann von MIDL in ein TLB zusammengestellt werden kann. github.com/dotnet/samples/tree/main/core/extensions/comserverdemo, die ich erfolgreich gearbeitet habe. in der Lage sein, auf die von diesem Comseverdemo -Projekt erzeugte comserver.dll zugreifen zu können und zu versuchen, darauf aus C ++ zuzugreifen. Comserverdemo ist definiert als: < /p>

Code: Select all

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;
}
}
}
Ich habe es nicht geschafft, viele Beispiele für einfache IDL -Dateien zu finden, aber ich habe es geschafft, dies möglicherweise falsch zusammenzustellen, die erfolgreich mit MIDL in ein TLB kompiliert werden:
[
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>
Ich habe auch 'ba9ac84b-c7fc-41cf-8b2f-1764eb773d4b' ausprobiert. Dies ist die Server-Schnittstelle hier, aber dies funktioniert auch, wenn der Versuch, aus C ++ zuzugreifen, gemacht wird. < /p>
Ich habe zwei Beispiele gefunden, die gezeigt haben Anzug, einer ist: < /p>
#import "COMServer.tlb"
using namespace COMServer;
CoInitialize(nullptr);

IServerPtr pServerPtr(__uuidof(IServer));
std::cout ComputePi()
Und das andere ist: < /p>
#import "COMServer.tlb"
using namespace COMServer;
CoInitialize(nullptr);

COMServer::IServerPtr pServerPtr;
HRESULT hRes = pServerPtr.CreateInstance(__uuidof(COMServer::IServer));
std::cout ComputePi()
In beiden Fällen scheint psserverptr null und ein 'e_pointer ungültiger Zeiger' zu sein. Die Ausnahme tritt auf, wenn Sie versuchen, die Computpi -Funktion auszuführen. Ein klares Beispiel für das Schreiben einer IDL -Datei für Microsoft Comserverdemo -Beispiel kann ein guter Ausgangspunkt für andere und mich sein>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post