Laden...

Array Übergabe (genauer: Rückgabe) von C (dll) an C#

Erstellt von robmir vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.415 Views
R
robmir Themenstarter:in
155 Beiträge seit 2005
vor 11 Jahren
Array Übergabe (genauer: Rückgabe) von C (dll) an C#

Hallo zusammen,

ich habe großes Problem ein Array von ANSI C (Code als DLL) an C# zu übergeben. Ich habe schon vieles versucht aber ohne Erfolg. Ich poste den Code (C und C#) unten, vielleicht kann mir jemand helfen. Ich habe schon Forum durchgeschaut aber nichts passendes gefunden.
Das Problem: > Fehlermeldung:

Der Einstiegspunkt "getBuff1" wurde nicht in der DLL "xyz.dll" gefunden.

unsigned short buf[22];
unsigned short* WINAPI __declspec(dllexport) getBuff1(unsigned char handle)
{
     return buf;
}
[DllImport(@"xyz.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
static extern IntPtr getBuff1(byte handle);
		
public void funz1()
{
        int counter = 1;
        unsafe 
	{
		IntPtr arrayValue = IntPtr.Zero;

		arrayValue = getBuff1((byte)counter); 
		
	}
}

309 Beiträge seit 2008
vor 11 Jahren

Servus,

die Calling Convention stimmt nicht. WINAPI ist (i.d.R) als Stdcall definiert, nicht Cdecl bentutz StdCall oder besser Winapi, dann bist du auf der sicheren Seite.

Du kannst die Angabe der Calling Convention im DLLImport-Attribut auch weglassen, wenn nichts angegeben ist wird Stdcall verwendet.

Edit:
Kleiner Hinweis:
Der Unsafe Block mach so überhaupt keinen Sinn.

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo robmir,

davon abgesehen würde ich als Rückgabetyp in der DllImport-Deklaration direkt short [] verwenden.

herbivore

R
robmir Themenstarter:in
155 Beiträge seit 2005
vor 11 Jahren

danke an Euch alle. Es klappt nicht so. Ich habe eine andere Lösung, in dem C Modul gebe ich nicht pointer aber unsigned short zurück. So ist es einfacher zu verarbeiten im C#. Der Vorteil ist, dass ich C beliebig anpasse kann, d.h. Wrapper Funktionen schreiben.