C#.NET und VC++ 6.0

Hallo!

Ich scheitere am Problem eine C#.NET DLL bzw. eine daraus erstellte TypeLibrary von einem VC++ Programm zu starten.

Ich habe mehrere Möglichkeiten (wie man das mit einer VB.tlb macht) im Internet gefunden und durchprobiert und bis jetzt noch keine Lösung gefunden.

zB:
#import „d:\testinterface\testinterface.tlb“ rename_namespace(„TestInterface“)

GUID typeLibGUID;
AfxGetClassIDFromString( _T("{F378D3F4-381C-3D38-ACF1-E97CBBEE31D7}"), &typeLibGUID);
AfxOleRegisterTypeLib(AfxGetInstanceHandle(), TypeLibGUID, „TestInterface.tlb“);
TestInterface::InterfaceTestPtr m_TestPtr;

HRESULT hr = m_TestPtr->GetActiveObject(__uuidof(TestInterface::InterfaceTest));

m_TestPtr.CreateInstance(__uuidof(TestInterface::InterfaceTest));
m_TestPtr->A_Plus_B(10, 10);


Visual C++ erkennt die Method A_Plus_B schon übers Autovervollständigen und meldet keine Compilierfehler.
Das erste Problem tritt dann bei CreateInstance auf. Die Methode ruft intern CoCreateInstance auf, die mir immer ein -27tausendirgendwas zurückwirft.
Dann ist m_TestPtr == NULL und ich kann natürlich die AplusBmehtode nicht aufrufen.

Wer hat so etwas denn bitte schon einmal gemacht, oder weiß eine andere Möglichkeit in VC++ Code aus C# aufzurufen?

Hallo!

[…]

Hallo auch!

Was Du generell machen kannst, ist ein COM-Objekt in C# zu programmieren, das Du dann von VC++ 6.0 aus wie jedes andere COM-Objekt auch instanziieren und nutzen kannst.
Ohne jetzt im Detail die genaue Fehlernummer zu haben vermute ich mal ganz stark, dass die COM-Klasse einfach nicht richtig registriert ist.

Du kannst mal hier nachsehen:
http://www.codeproject.com/csharp/CSComTemplate.asp
Dort habe ich einen Wizard für VS 2003 veröffentlicht, mit dem das Erstellen von C#-COM-Objekten sehr vereinfacht wird.

Die erstellte Assembly muss dann mittels regasm registriert werden (ähnlich wie das Registrieren von unmanaged-COM-Objekten per regsvr32). Zu regasm gibt es eine entsprechende Hilfe (regasm /?).

Dann solltest Du die entsprechende C#-COM-Klasse z.B. per CoCreateInstance() instanziieren können. Oder Du verwendest SmartPointer und importierst die Type Library.

Gruß,

mav

Der Versuch mit einem Smartpointer ist leider auch gescheitert. Beim Initialisieren fehlgeschlagen.

Den Fehlercode könnte ich dir morgen noch raussuchen. War glaub ich einfach die Minvalue von Long.

Habe ebenfalls schon gedacht, an dem C# einiges zu ändern. Der Nachteil ist halt, dass diese Komponenten die ich ansprechen will teilweise schon existieren, und diese hauptsächlich von C# aus aufgerufen werden, sekundär eben von meinem C++.

Ich werd jedenfalls morgen weiterbasteln.
Danke

Hallo!

ich hab dir ein kleines Beispiel von mir geschickt. Danach hätte ich noch diese Zeilen eingebaut.

AfxGetClassIDFromString( _T("{F378D3F4-381C-3D38-ACF1-E97CBBEE31D7}"), &typeLibGUID);
AfxOleRegisterTypeLib(AfxGetInstanceHandle(), typeLibGUID, „TestInterface.tlb“);

Das wirft mir aber beim AfxOleRegisterTypLib immer eine Assertion, weil
„IsEqualGUID(tlid, tlidActual)“ in der Methode drin FALSE zurückliefert.

Wenn ich meine Registry durchsuche finde ich mittlerweile schon 4 verschiedene UUIDs… ich probiere immer alles mit allen vieren durch. Ändert aber an sich nichts.

mfg
Andreas

Nachdem ich nicht über einen absoluten Pfad auf die DLL zugegriffen habe, sondern die Dateien im DEBUG-Ordner waren, hat es funktioniert!

Nachdem ich nicht über einen absoluten Pfad auf die DLL
zugegriffen habe, sondern die Dateien im DEBUG-Ordner waren,
hat es funktioniert!

Na prima, ich bin nämlich nicht dazu gekommen, Deine Sourcen auszupacken und anzusehen und habe leider in absehbarer Zeit auch nicht so viel davon übrig, dass ich mich da weiter reinknien könnte, sorry…

Martin