Announcement

Collapse
No announcement yet.

Array übergeben an Funktion in einer C++-DLL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Array übergeben an Funktion in einer C++-DLL

    Hallo Leute,

    ich habe eine DLL geschrieben, die ein Array mit Werten füllen und dieses zurückgeben soll.

    Code:
    __declspec(dllexport) void TestGetBuffer(int iArray[])
    {
    	for (int i = 0; i < 1000; i++)
    	{
    		iArray[i] = ipBuffer[i];
    	}
    }
    Diese Funktion möchte ich gerne von C# aus aufrufen, damit sie mir das nicht initialisierte Array mit Werten füllt.

    Benutze ich dafür den out-Parameter, so wird mir der Ausnahmefehler NotSupportedException vorgeworfen.

    Code:
    ...
    int[] intArray;
    TestGetBuffer(out intArray);
    Weiß jemand, wie man Arrays von C++-Funktionen aus einer DLL an C# übergeben kann?

    Viele Grüße,
    Marco

  • #2
    Ich bitte um Entschuldigung fur meine Schprache aber Ich annehmen das Sie die gesteurte Code zussamen mit ungesteuert Code versuchen zu benutzen. Lessen Sie bitte in :
    http://msdn2.microsoft.com/en-us/library/ms973872.aspx

    Comment


    • #3
      Ja klar, aber gibt es dazu ein konktretes Code-Beispiel, ich komme da leider nicht weiter.


      Viele Grüße,
      Marco

      Comment


      • #4
        Hat da niemand was?

        Comment


        • #5
          Hi
          Ich denke ein Problem ist, dass auf der unmanaged C++ Seite die Array Grösse unbekannt ist. Eine einfach Lösung wäre:

          Unmanaged C++ Seite:
          Code:
          int GetBufferSize()
          {
              return 28;
          }
          
          void CopyBuffer(int arr[], int size)
          {
              for (int i = 0; i < size; ++i)
              {
                  arr[i] = i;
              }
          }
          Natürlich muss GetBufferSize die tatsächliche Grösse des zu kopierenden Buffers zurückgeben.
          Die beiden Funktionen GetBufferSize und CopyBuffer sind via *.def File exportiert. Bei __declspec(dllexport) wird der dekorierte Name der Funktion exportiert, das muss berücksichtigt werden (oder extern "C" verwenden).

          Managed C# Seite:
          Code:
          using System;
          using System.Runtime.InteropServices;
          
          namespace CallUnmanaged
          {
              class Program
              {
                  [DllImport("UnmanagedLib.dll")]
                  static extern Int32 GetBufferSize();
                  
                  [DllImport("UnmanagedLib.dll")]
                  static extern void CopyBuffer(Int32[] arr, Int32 len);
                  
                  public static void Main(string[] args)
                  {
                      Int32 size = GetBufferSize();
                      Int32[] arr = new Int32[size];
                      CopyBuffer(arr, arr.Length);
                  }
              }
          }
          Dabei muss die UnmanagedLib.dll im Working Directory der C# Applikation liegen (oder der Pfad muss irgendwie bekannt gemacht werden). Die importierten Funktionen sollten in einer Klasse gekappselt werden (hier wegen der Übersichtlichkeit nicht gemacht).

          Eine andere Strategie wäre den Speicher auf der unmanaged Seite anzulegen und dann wieder (auch auf der unmanaged) Seite freizugeben. Ich denke aber das wäre die kompliziertere Lösung.

          Ich hoffe das hilft für dein Problem weiter.

          Gruss Simon
          Zuletzt editiert von Simon Gysi; 10.10.2007, 13:13.

          Comment

          Working...
          X