Laden...

c# (managed) dll in c++ MFC aufrufen

Erstellt von Tossi65 vor 6 Jahren Letzter Beitrag vor 6 Jahren 3.434 Views
T
Tossi65 Themenstarter:in
83 Beiträge seit 2010
vor 6 Jahren
c# (managed) dll in c++ MFC aufrufen

Hallo Leute,
ich brauch eure Unterstützung. Ich habe schon das Internet gequält, aber ohne Erfolg. Ich habe eine c# DLL erstellt mit 2 Funktionen (Drucken und Vorschaudialog). Ich habe das in c# gemacht, da es hierfür die passenden Komponenten gibt. Mit VC++ ist unser Frame erstellt, welchen wir benutzen.

Ich habe gelesen, das es mit einem Wrapper gehen soll, aber das bekomme ich nicht hin. Ich bin zu dumm dazu. Kann mir jemand helfen????

Ich benutze VS 2017 Community.

Danke Tossi

16.807 Beiträge seit 2008
vor 6 Jahren

Also wenn Dir mit dieser spärlichen Information irgendjemand spezifisch helfen kann, dann hat diese Person hellseherische Fähigkeiten.

Bedenke, dass jeder Leser hier absolut keine Ahnung hat, was Du vor Dir siehst und welches Problem Du gerade hast.
Beschreibst / zeigst Du es nicht, kann ein potentieller Helfer das auch nicht wissen.

4.931 Beiträge seit 2008
vor 6 Jahren

Hallo,

so einfach ist das nicht möglich, wie du wohl schon erkannt hast.
Entweder per C++/CLI oder aber per COM, s. Calling .NET DLL from MFC App.
Weitere Treffer im Internet findest du per "call C# dll from mfc".

T
Tossi65 Themenstarter:in
83 Beiträge seit 2010
vor 6 Jahren

@Abt:
Sorry, hier noch ein paar Infos. Der Frame besteht ca. 35 einzelnen Units geschrieben in VC++ 6. Das ist schon schlimm genug, da schwer zu warten und erweitern. Diesen jetzt auf /clr um zu stellen wird nicht einfach werden.
Dazu ist dieser Frame bei ca. 60 Grosskunden(Industrie) im Einsatz. Soll heißen, wir können nicht einfach mal eben umstellen. Dazu läuft dieser Frame auch noch unter verschiedenen Windowsversionen, das kann von Win98, über WinXP bis zur aktuellen Windows 10 gehen. Da geht Com auch nicht so einfach, zumal wir nicht immer administrativen Zugang haben. Deshalb möchte ich es so einfach und unkompliziert wie möglich machen. Ich würde den Frame auch lieber ersetzen, das bleibt aber nur ein Traum. Ich möchte versuchen die alte Welt mit der neuen mit einfachen Mitteln zu verbinden.

Nehmen wir einmal ei Beispiel:

Ich schreibe ein c# DLL, welche 2 Funktionen hat; eine ruft einfach eine MessageBox.Show auf. Als Übergabeparameter wird die Nachricht als String übergeben. Als Rückgabe wird die Antwort(OK, usw.) gegeben.
Die 2. Funktion ruft einfach einen Modalen Dialog auf. Als Rückgabe wird die Antwort(OK, usw.) gegeben.

Diese Dll möchte ich aus c++ nutzen. Also habe ich auch daran gedacht, als Bindeglied c++/cli zu nutzen. Das wäre der wrapper. Hier kann ich die managed DLL per Verweis einbinden und erhalte eine Headerdatei für c++. Soweit so gut.
Als Verweis einbinden bekomme ich hin. Aber ich bekomme die Wrapper DLL nicht in die c++ Anwendung rein.

Danke Tossi

T
Tossi65 Themenstarter:in
83 Beiträge seit 2010
vor 6 Jahren

Hallo,
leider habe ich noch weiteres gehört und weiterprobiert. Ich habe von Robert Giesecke ein Nuget Package gefunden, das interessant ist. Ich habe es probiert, aber irgendetwas scheint hier nicht Rund zu sein.

csharp.dll


[DllExport("showbox", CallingConvention = CallingConvention.Cdecl)]
        public void Show(String s)
        {
            MessageBox.Show(s);
        }
        [DllExport("printdlg", CallingConvention = CallingConvention.Cdecl)]
        public void ShpwModal()
        {
            Dlg d = new Dlg();
            try
            {
                d.ShowDialog();
            }
            finally
            {
                d.Dispose();
                d = null;
            }
        }

mfc c++ dll:


void CMainFrame::OnDruckenDruck()
{
	//Declare an HINSTANCE and load the library dynamically. Don’t forget 
	//to specify a correct path to the location of LoadMe.dll

	HINSTANCE LoadME;
	// TODO: Fügen Sie hier Ihren Befehlshandlercode ein.
	//You need to declare types to point on classes/functions in LoadMe.dll
	//Assume, you have a function in your LoadMe.dll with a name 
	//EntryPoint, which takes two parameters of types int and const char *, 
	//and is of type void. You need to create a new type as a 
	//pointer to that function as it is shown below.
	LoadME = AfxLoadLibrary(CString("c:\\Projekte\\wrappen\\WrapperKlasse\\csharpDLL\\csharpDLL\\bin\\Debug\\csharpDLL.dll"));
	//	LoadMe = LoadLibrary("..\\enter a Path To Your Dll here\\LoadMe.dll");
	LoadME = LoadLibrary(CString("c:\\Projekte\\wrappen\\WrapperKlasse\\csharpDLL\\csharpDLL\\bin\\Debug\\csharpDLL.dll"));

	// Check to see if the library was loaded successfully 
	if (LoadME != 0)
	{
		printf("LoadMe library loaded!\n");

		typedef void(*EntryViewfuncPtr)(const CString s);
		//typedef void(*EntryViewfuncPtr)(const char * argv);
		//declare a variable of type pointer to EntryPoint function, a name of 
		// which you will later use instead of EntryPoint
		EntryViewfuncPtr LibMainViewPoint;


		// GetProcAddress – is a function, which returns the address of the 
		// specified exported dynamic-link library (DLL) function. After 
		// performing this step you are allowed to use a variable 
		// LibMainEntryPoint as an equivalent of the function exported in 
		// LoadMe.dll. In other words, if you need to call 
		// EntryPoint(int, const char *) function, you call it as 
		// LibMainEntryPoint(int, const char *)

		LibMainViewPoint = (EntryViewfuncPtr)GetProcAddress(LoadME, "showbox");

		if (LibMainViewPoint == NULL)
		{
			FreeLibrary(LoadME);
			AfxMessageBox(CString("Process load FAILED!!"));// << endl;
		}

		else

		{
			AfxMessageBox(CString("Process address found at: "));// << Proc << endl << endl;
																 //Proc(NULL,NULL,NULL,NULL);
			LibMainViewPoint(CString("Hallo"));
			FreeLibrary(LoadME);
		}

	}
	else
	{
		printf("LoadMe library failed to load!\n");
		AfxMessageBox(CString ("LoadMe library failed to load!\n"), 0, 0);
	}

Die DLL wird gefunden aber der Einsprungspunkt nicht. Alles verwirrend. 😉

Danke

Danke Tossi

4.931 Beiträge seit 2008
vor 6 Jahren

Du meinst Unmanaged Exports? Hast du bei den Build-Optionen der C#-DLL explizit x86 bzw. x64 eingestellt?

T
Tossi65 Themenstarter:in
83 Beiträge seit 2010
vor 6 Jahren

Ja es steht alles auf X86. 🙁

Danke Tossi

4.931 Beiträge seit 2008
vor 6 Jahren

Schau mal mit dem Dependency Walker bei der erzeugten DLL nach, welche Funktionen wirklich exportiert wurden.