2017-08-24 4 views
0

Ich muss auf dynamische Bibliothek mit C# zugreifen. Es funktioniert gut bei der Verwendung der COM-Bibliothek, aber wenn ich versuche, dynamische Bibliothek verwenden, verursacht es einen Fehler.C# - Funktion aus dynamischer Bibliothek aufrufen dll

erste Problem

Zuerst ich tue mein Code wie folgt:

[DllImport("mydll.dll")] 
public static extern int toGetInfo(uint id, char[] strVolume, char[] strInfo); 
// strVolume and strInfo is parameter that return value with [out] 

public static void Main() 
{ 
char[] test1,test2; 
toGetInfo(0,test1,test2); 
} 

Aber es nicht mehr mit Fehler Verwendung der nicht zugewiesenen lokalen Variablen für test1 und test2 kompilieren. Dann habe ich meinen Code bearbeiten, indem aus wie folgt ergänzt:

[DllImport("mydll.dll")] 
public static extern int toGetInfo(uint id, out char[] strVolume, out char[] strInfo); 
// strVolume and strInfo is parameter that return [out] 

public static void Main() 
{ 
char[] test1,test2; 
toGetInfo(0, out test1, out test2); 
} 

Es kann zu kompilieren, aber gibt Nullwert Test1 und Test2.

zweites Problem

[DllImport("mydll.dll")] 
public static extern int toOpen(uint id, char* name); 

public static void Main() 
{ 
char name; 
toOpen(0, name); 
} 

Wenn kompilieren geben Fehler „Pointers und feste Größe Puffer nur in einem unsicheren Kontext verwendet werden können“

Jede Idee, wie es zu tun?

+0

Ein Zeichen ist zwei Bytes in C# und in c es ist wahrscheinlich ein. Verwenden Sie in C# ein Byte []. In c sind die Zeichenarrays mit '\ 0' abgeschlossen, daher ist es am besten, IntPtr Marshal.StringToHGlobalAnsi (string) zu verwenden, das alle Aufgaben automatisch erledigt. Also deklariere char [] als IntPtr. – jdweng

+0

nach dem Wechsel zu intPtr gibt es etwas. Warte ich werde updaten – njz

Antwort

1

Versuchen folgende:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 


namespace ConsoleApplication74 
{ 
    class Program 
    { 
     [DllImport("mydll.dll")] 
     public static extern int toGetInfo(uint id, IntPtr strVolume, IntPtr strInfo); 

     [DllImport("mydll.dll")] 
     public static extern int toOpen(uint id, IntPtr name); 

     const int STRING_LENGTH = 256; 
     static void Main(string[] args) 
     { 

      IntPtr strVolumePtr = Marshal.AllocHGlobal(STRING_LENGTH); 
      IntPtr strInfoPtr = Marshal.AllocHGlobal(STRING_LENGTH); 

      uint id = 123; 

      int status1 = toGetInfo(id, strVolumePtr, strInfoPtr); 

      string strVolume = Marshal.PtrToStringAnsi(strVolumePtr); 
      string strInfo = Marshal.PtrToStringAnsi(strInfoPtr); 

      string name = "John"; 
      IntPtr openNamePtr = Marshal.StringToHGlobalAnsi(name); 
      int status2 = toOpen(id, openNamePtr); 

      Marshal.FreeHGlobal(strVolumePtr); 
      Marshal.FreeHGlobal(strInfoPtr); 
      Marshal.FreeHGlobal(openNamePtr); 

     } 

    } 

} 
+0

danke es funktioniert! – njz

+0

ich möchte fragen, wenn ich nicht sicher bin, die STRING_LENGTH, gibt es einen Trick, um das zu begegnen? danke – njz

+0

ist es auch für dword und byte anwendbar? – njz

Verwandte Themen