大家好,
我想在C#中从非托管dll变成托管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#中语法是个问题,我似乎不能让evan成为第一个函数
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字符串、字符串*、char*、char[]的参数并在返回时放置一个断点;ap_handle的值总是为0x0000
导入这些函数的正确方法是什么?
发布于 2017-06-08 15:16:04
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 in C#是C++的wchar_t,而不是C++ char。
如果你需要一个C++ char in C#,它要么是byte,要么是sbyte。但是p/invoke只会对System.String做正确的事情。
发布于 2017-06-08 15:18:28
仅仅复制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。
https://stackoverflow.com/questions/44439402
复制相似问题