[C#] Marshaling

olampl

Lt. Commander
Registriert
Aug. 2005
Beiträge
1.691
Hallo,

muss einer C++ dll einen Pointer auf ein Array mit structs übergeben, dieses soll dann gefüllt werden (daher out Param).

Code:
[DllImport("gngetsol.dll", EntryPoint="GNSol_query", CharSet = CharSet.Auto)]
	public static extern int GNSolQuery( out IntPtr  id_array, int maxIds, out int vailIds);


// Strucktur
Code:
[ StructLayout( LayoutKind.Sequential,  Size = 36,CharSet=CharSet.Ansi )] 
		public struct GNSolId
		{
			[MarshalAs(UnmanagedType.ByValTStr, SizeConst=8)]
			public string Owner;
			
			[MarshalAs(UnmanagedType.ByValTStr, SizeConst=8)]
			public string Rcvid;

			[MarshalAs(UnmanagedType.ByValTStr, SizeConst=8)]
			public string Outid;

			[MarshalAs(UnmanagedType.ByValTStr, SizeConst=8)]
			public string Name;

			public int Ok;
		}

//
Code:
int bar = 0;
			arGnSolidId = new GeoPPWrapper.GNSolId[32];

			for (int i = 0; i< arGnSolidId.Length; i++)
			{
				arGnSolidId[i] = new GNSolId();
}
// Umwandlung in unmanaged
IntPtr ptr = Marshal.AllocCoTaskMem(Marshal.SizeOf(arGnSolidId[0]) * (arGnSolidId.Length));
				
IntPtr ptrRunner = ptr;

for (int i=0; i<arGnSolidId.Length; i++)
{
Marshal.StructureToPtr(arGnSolidId[i], ptrRunner, false);
ptrRunner = (IntPtr)((int)ptrRunner + Marshal.SizeOf(arGnSolidId[0]));
}
int foo =  GeoPPWrapper.GeoPPWrapper.GNSolQuery( out ptr ,  32 ,out bar );


Die Version der dll kann ich auslesen, aber das war es auch.

Als fehler meldung bekomme ich "Object reference not set to an instance of an object"

hat jemand eine idee!
 
Zuletzt bearbeitet: (Ergänzung)
AW: [C#]Marshaling

Hallo

würde sagen das du ein "using ..." für das C# Programm vergessen hast.

MFG

tewes
 
^^ und welche.

using System; is eh drin

und

using System.Runtime.InteropServices;

brauche ich für das Marshal.

Habe mir allerdings sagen lassen das man das über eine zwischen Klasse wrappen muss,
da das marschaling nur mit prim. Datentypen klappt (habe ich auch schon hinbekommen).
Mit kompl. Datentypen, wie in meinem fall jedoch nicht.

gebe bescheid sobald ich mehr weis
 
An welcher stelle zeigt der Kompiler denn den Fehler an?

Und ich würde noch
Code:
using System.Text;
using System.Collections.Generic;
einfügen.

Wenn das eine Windows Form ist, benötigst du noch
Code:
using System.Windows.Forms;
Ich mein das waren alle die als "Standart" drin sein müssen.

MFG

tewes
 
Der Fehler kommt wenn ich meinen Komplexen Datentyp an die C function übergeben will.
 
Hm...wie eine zweite sprache in C# eingebunden wird weiss ich lieder nich, aber ein Blick in die .NET Docku ist immer sehr hilfreich.

MFG

tewes
 
Zurück
Oben