C# DLL erstellen und in ein MFC Projekt einbinden
-
Hallo,
ich versuche eine C# DLL zu erstellen und in ein bestehenes MFC Projekt einzubinden. Mit LoadLibrary() hatte ich bislang keinen Erfolg.
Kann mir dabei jemand helfen? Was gibt es zu beachten?Gruß
schussi
-
Eine genauere Beschreibung (genaues Vorgehen, z.B. durch Code posten, genauer Fehlertext usw.) wäre vermutlich hilfreich...

-
Eine C#-DLL (Assembly) kann man auf zwei verschiedene Arten "einbinden":
1. (ohne etwas an der C#-Assembly zu ändern) Du aktiviert für die Dateien, wo Du den Zugriff auf die C#-Dinge benötigst die "/clr" Compiler-Option. Dann kannst Du einfach die Assembly mittels "#using <NameDerAssembly.dll>" einbinden und direkt verwenden (z.B. System::String ^s = gcnew System::String("Hallo");
2. (mit anpassung der C#-Assembly) Du kannst Die C#-Assembly als COM-InterOp-Assembly zur Verfügung stellen. Dazu musst Du den nötigen Klassen einige spezielle Attribute verpassen, die DLL registrieren (regAsm) und kannst dann diese via COM in Deinem MFC Programm verwenden. Ich persönlich würde von dieser Vorgehensweise abraten.
-
Vielen Dank für die schnellen Antworten!
@Jochen: Deine Tipps waren sehr gut! Ich habe deine 2. Variante versucht und ein Beispiel gefunden mit dem es mir gelungen ist, einen bidirektionalen Datenaustausch mit einer Dll zu realisieren.
Hier ist alles recht anschaulich beschrieben:http://www.codeproject.com/KB/COM/nettocom.aspx
Zur Verdeutlichung für alle die es interessiert:
Hier meine C# DLL:
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.IO; namespace TestDLL { [Guid("D6F88E95-8A27-4ae6-B6DE-0542A0FC7039")] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface _Class1 { [DispId(1)] int GetDay(); [DispId(2)] int GetMonth(); [DispId(3)] int GetYear(); [DispId(4)] int DayOfYear(); [DispId(5)] void SetDay(int day); } [Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA4")] [ClassInterface(ClassInterfaceType.None)] [ProgId("TestDLL.Class1")] public class Class1 : _Class1 { //string test = "Hello World"; public Class1() { } public int GetDay() { return(1); } public int GetMonth() { return(DateTime.Today.Month); } public int GetYear() { return(DateTime.Today.Year); } public int DayOfYear() { return(DateTime.Now.DayOfYear); } public void SetDay(int day){ StreamWriter myFile = new StreamWriter("C:\\Ausgabe.txt"); myFile.Write(day.ToString()); myFile.Close(); } } }Hier der C++ Code:
#import "TestDLL.tlb" using namespace TestDLL; ... TestDLL::_Class1 *com_ptr; CoInitialize(NULL); TestDLL::_Class1Ptr p(__uuidof(TestDLL::Class1)); com_ptr = p; com_ptr->SetDay(2);Die tlb-Datei mit
regasm TestDLL.dll /tlb:TestDLL.tlb
erzeugen siehe auch den Link oben.Die andere Variante werde ich ebenfalls noch einmal ausprobieren. Mal sehen ob das genauso gut funktioniert.