c++ dll <---> .net
-
Hallo liebes Forum,
Ich bin neu in der DLL Programmierung und wollte via C++ (dev c++) eine DLL für C# (Visual Studio schreiben).
Der DLL Code:
/* Replace "dll.h" with the name of your header */ #include "dll.h" #include <windows.h> DllClass::DllClass() { } DllClass::~DllClass () { } extern "C" __declspec(dllexport) void logic_request (int number, int &ret); BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) { switch (reason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } /* Returns TRUE on success, FALSE on failure */ return TRUE; } void logic_request (int number, int &ret) { ret = 5; }
logic_request sollte also einfach nur 5 zurückgeben.
C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Program { [System.Runtime.InteropServices.DllImport("logic.dll")] public static extern void logic_request (int number, int ret); static void Main(string[] args) { int ret = 0; logic_request(1, ret); Console.WriteLine(ret.ToString()); Console.ReadLine(); } } }
Fehler:
Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
Vielen Dank für die hilfen und Infos!
Grüße!
-
Nimm ein Pointer und keine Referenz. C kennt keine Referenzen und das was Du für das P/Invoke brauchtst ist ein C- Interface.
Auf der C# Seite benötigt deine Signatur dann das ref Keyword.
Ausserdem kann Du dir mal folgendes anschauen:
http://clrinterop.codeplex.com/
http://msdn.microsoft.com/en-us/magazine/cc164193.aspxSimon
-
Oder verwende nen ganz normalen Returnwert statt nem Output-Parameter.