Wie die Überschrift schon sagt möchte ich eine c# DLL von einem c++ Programm aufrufen. Ich habe zu diesem Thema auch schon eine Seite gefunden mit einem Beispiel. Die c# dll mit einem Interface zu entwickeln war kein Problem, nur das c++ Programm konnte nicht die dll aufrufen.
Hier ist der Link zu der Seite : http://www.codeproject.com/csharp/ManagedCOM.asp
Ich hab die Dll richtig in das C++ Programm importiert, aber bei der 2 Zeile :
MyInterop::IMyDotNetInterfacePtr pDotNetCOMPtr;
Sagt er das IMyDotNetInterfacePtr kein Member von MyInterop ist.
Ich bedanke mich schon vorher für eure Hilfe,
lg.
Stefan
Weiß keiner eine Antwort für mein Problem ??
Du kannst in deinem C++ Projekteigenschaften einfach einen Verweis auf die
C# dll erstellen, und sie dann wie in C# verwenden.
Das C++ Projekt muß dann natürlich mit /clr kompiliert werden.
Gernot Melichar
Kannst du mir vielleicht sagen wo ich das einstelle ???
Hier gehts doch darum klassischen, unmanaged C-Code mit .NET über den COM-Weg miteinander zu verheiraten. Da natürlich managed C nicht weiter.
Aber ohne Code ist das Problem nur schwer zu lösen....
In C++/CLI (VS2005) ist es sehr wohl möglich managed und native Code in
einer Assembly zu mischen.
http://msdn2.microsoft.com/en-us/library/x0w2664k.aspx
Folgendes bezieht sich also auf VS2005 C++/CLI:
Also Project/Properties/Common properties/References einen Verweis
auf die C# dll erstellen, dann unter Configuration Properties Common Language Runtime Support(/clr) einstellen.
Gernot Melichar
Also mein code für die c# dll:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace MyInterop
{
[Guid("03AD5D2D-2AFD-439f-8713-A4EC0705B4D9")]
interface IMyDotNetInterface
{
void ShowCOMDialog();
}
[ClassInterface(ClassInterfaceType.None)]
[Guid("0490E147-F2D2-4909-A4B8-3533D2F264D0")]
class MyDotNetClass : IMyDotNetInterface
{
// Need a public default constructor for COM Interop.
public MyDotNetClass()
{}
public void ShowCOMDialog()
{
System.Windows.Forms.MessageBox.Show(“I am a" +
" Managed DotNET C# COM Object Dialog”);
}
}
}
und ich habe vorher die dll mir REGASM regestriert
Mein Code für das c++ Programm ist das :
#import "<Full Path>\com.MyInterop.tlb" named_guids raw_interfaces_only
CoInitialize(NULL); //Initialize all COM Components
// <namespace><InterfaceName>
MyInteropIMyDotNetInterfacePtr pDotNetCOMPtr;
// CreateInstance parameters
// e.g. CreateInstance (<namespaceCLSID_<ClassName>)
HRESULT hRes =
pDotNetCOMPtr.CreateInstance(MyInteropCLSID_MyDotNetClass);
if (hRes == S_OK)
{
BSTR str;
pDotNetCOMPtr->ShowCOMDialog ();
//call .NET COM exported function ShowDialog ()
}
CoUninitialize (); //DeInitialize all COM Components
Ich habe auch das gemacht was Meli geschrieben hat, aber erkennt den Interfacenamen noch immer nicht, muss ich noch was importieren ??
Ich habe das unbestimmte Gefühl, wir reden aneinander vorbei 😁
Wie Svenson bereits geschrieben hat, bezieht sich der codeproject-Artikel
auf einen Umweg über COM, was meines Erachtens unötig ist:zumindest
unter VS2005 C++/Cli
Nehmen wir eine c# dll:
namespace test
{
class meineDll
{
public meineDll(){}
public void machwas()
{
Console.WriteLine("Hallo!");
}
}
}
Dann kannst Du in deinem C++ Projekt, nachdem du den Verweis erstellt hast
auf die dll zugreifen ohne COM zu benutzen:
int main()
{
test::meineDll^ d = gcnew test::meineDll();
d->machwas();
//Ausgabe:Hallo
}
Oder sollte ich irgendwas an deinem Problem nicht verstanden haben, und
Du musst(aus welchen Grund auch immer) über COM gehen?
Gernot Melichar
ok , ich werd das morgen dann probieren ob ich das zusammen bringe 😜
Danke für eure Geduld und Hilfe
ALso das funktioniert perfekt, meli du bist in mein Abendgebet vorhanden 🙂 .
Ich habe nämlich geglaubt es ist die einzige Möglichkeit mit COM eine c# dll in c++ aufzurufen.
Nochmals vielen Dank !!
Aber ich würde gerne wissen warum das mit COM bei mir nicht geklappt hat.