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.aspx

    Simon



  • Oder verwende nen ganz normalen Returnwert statt nem Output-Parameter.


Anmelden zum Antworten