Laden...

C# DLL + laden in c++

Letzter Beitrag vor 18 Jahren 10 Posts 3.421 Views
C# DLL + laden in c++

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>
MyInterop
IMyDotNetInterfacePtr pDotNetCOMPtr;

// CreateInstance parameters
// e.g. CreateInstance (<namespaceCLSID_<ClassName>)
HRESULT hRes =
pDotNetCOMPtr.CreateInstance(MyInterop
CLSID_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.