2017-06-08 126 views
0

Hy all,DllImport C Sharp const char *

我想從一個非託管dll到C#託管的dll。

文檔中

是:

typedef void* AP_HANDLE 
typedef uint32_t ap_u32 

AP_HANDLE ap_CreateVirtual(const char *szFilename) 

void ap_SetState(AP_HANDLE apbase, const char *szState, int nValue) 

unsigned char *ap_ColorPipe(AP_HANDLE  apbase, 
          unsigned char *pInBuffer, 
          ap_u32   nInBufferSize, 
          ap_u32  *rgbWidth, 
          ap_u32  *rgbHeight, 
          ap_u32  *rgbBitDepth) 

在C++中工作正常,但在C#語法看來我不能讓不埃文第一功能工作

public unsafe class appbase 
{ 
    [DllImport("D:\\apbase.dll", EntryPoint = "ap_CreateVirtual")] 
    //, CharSet = UnicodeEncoding 
    //, CallingConvention = CallingConvention.StdCall 

    public static extern void* ap_CreateVirtual(char* szFilename); 
} 
問題

public static void Main() 
    { 
     unsafe 
     { 
      void* ap_handle = null; 

      appbase APPbase = new appbase(); 

      string s = "D:\\ASX.xsdat"; 

      fixed (char* p = s) 
      { 
       ap_handle = APPbase.ap_CreateVirtual(p); 
      } 

      return; 
     } 
    } 

嘗試使用ap_CreateVirtual字符串的參數,String *,ch ar *,char []並在返回時放置一個斷點; ap_handle始終爲值0x0000

什麼是導入這些函數的正確方法?

+1

你需要讀取P/Invoke –

回答

2

char*是.NET字符串的默認編組。

[DllImport("D:\\apbase.dll", EntryPoint = "ap_CreateVirtual", CharSet = CharSet.Ansi)] 
//, CallingConvention = CallingConvention.StdCall 
public static extern System.IntPtr ap_CreateVirtual(string szFilename); 

你原來的嘗試是錯誤的,因爲char在C#是C++的wchar_t,不C++ char

如果您需要C#中的C++ char,它可以是bytesbyte。但是p/invoke只會用System.String做正確的事情。

+1

與CharSet = CharSet.Ansi它分解並與CharSet = CharSet.Unicode它通過但指針仍然爲0後......因此它不工作 –

0

僅僅複製C++頭文件是不夠的。你需要了解這些論據實際上的含義以及它們是如何表現的。第一個功能是很簡單:

[DllImport("...", EntryPoint="ap_CreateVirtual")] 
public static extern IntPtr ap_CreateVirtual(
    [In, MarshalAs(UnmanagedType.LPStr)] string szFilename); 

我假定在第二,szState再次是一個簡單的LPSTR,而pInBuffer是最有可能的一個固定長度byte[]與由nInBufferSize確定大小。 rgbXXX似乎是ref的論點。返回類型可能再次是LPStr。

+0

它的在s =「D:\\ ASX.xsdat」的調用後,它似乎仍然出現故障。 ap_CreateVirtual(一個或多個); –

+0

@ dorin.petre這很可能意味着您需要更改調用約定,可能是調用CallConvention.Cdecl(適當的調用約定應該是文檔的一部分,但如果不是,Cdecl可能是一個調用約定你想要C風格的功能)。此外,請確保本地DLL和您的應用具有相同的位數 - 默認情況下,.NET應用程序爲AnyCPU,因此在64位系統上,它們無法調用32位本機DLL。什麼「崩潰」? – Luaan

+0

錯誤:vshost32.exe已停止工作 –