2009-04-26 24 views
3

Ich habe eine C++ DLL, die die folgende FunktionRangierung in C# (Passing-Struktur auf einen nicht verwalteten Typen)

long func(struct name * myname) 
{ 
    strcpy(myname->firstname,"rakesh"); 
    strcpy(myname->lastname,"agarwal"); 
    return S_OK; 
} 

struct name 
{ 
    char firstname[100]; 
    char lastname[100]; 
} 

Ich möchte rufen Sie diese Funktion aus einer C# Anwendung aussetzt, so dass ich wie folgt vorgehen:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
unsafe public struct name 
{ 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst=100)] 
    public string firstname; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] 
    public string lastname; 
} ; 


[DllImport("C++Dll.dll")] 
public unsafe static extern long func(name[] myname); 

name[] myname = new name[1]; 
func(myname); 

Die Anwendung wird erfolgreich erstellt. Wenn die C# -Anwendung EXE ausgeführt wird, wird die Funktion func() erfolgreich aufgerufen und es ist möglich, die Felder erfolgreich in der DLL zu füllen. Wenn die Funktion jedoch zu der C# -Anwendung zurückkehrt, enthält die Variable myname weiterhin Nullwerte für die Strukturfelder (firstname und lastname).

Bitte Änderungen vorschlagen, so dass ich in der Lage bin, um die Felder Werte von myname bevölkert (so dass nach der Funktion func() beendet Ausführung, die Variable myname->firstname „rakesh“ enthält und myname->lastname enthält „agarwal“

. Hinweis: String kann nicht innerhalb der Struktur verwendet werden

Antwort

3

den Import als public unsafe static extern long func(ref name myname) erklären, und nennen sie es wie:.

name myname = new name(); 
func(ref myname); 

Wahrscheinlich benötigen Sie die unsicheren Deklarationen übrigens nicht zur Namensstruktur oder Import-Deklaration.

7

Anstatt ein Array zu verwenden, übergeben Sie die Struktur als Referenz. Bei einem PInvoke-Aufruf wird eine ref-Struktur in einen Zeiger auf die Struktur übersetzt. Das Argument ref weist die CLR außerdem an, Daten in beide Richtungen zu migrieren, in den systemeigenen Code und dann wieder zurück.

[DllImport("C++Dll.dll")] 
public unsafe static extern long func(ref name myname); 

Auch, wenn Sie eine Menge von Interop-Arbeit sind empfehle ich Ihnen den Assistenten PInvoke Interop check out (link). Dieses Tool konvertiert automatisch die Mehrzahl der C-Typ-Definitionen (einschließlich Strukturen, Enums, Vereinigungen und Funktionszeiger) in ihre entsprechenden C# - oder VB.Net-Typen. Es konvertiert zusätzlich Signaturen, die diese Typen enthalten.

Verwandte Themen