定义C++;输入C#

定义C++;输入C#,c#,c++,dll,C#,C++,Dll,我有一个.DLL和一个.h文件。我使用的是C++,但是.dll是用C++编写的。我在调用.DLL中的某些函数时遇到了问题。当我需要调用定义了类型的函数时,问题就出现了。例如,include with the.DLL是一个.h文件,其类型定义如下: struct device_info { HANDLE dev_handle; // valid open handle or NULL wchar_t* product_string; // malloc'd string or N

我有一个.DLL和一个.h文件。我使用的是C++,但是.dll是用C++编写的。我在调用.DLL中的某些函数时遇到了问题。当我需要调用定义了类型的函数时,问题就出现了。例如,include with the.DLL是一个.h文件,其类型定义如下:

struct device_info {
  HANDLE dev_handle;  // valid open handle or NULL
  wchar_t* product_string;     // malloc'd string or NULL
  wchar_t* serial_string;     // malloc'd string or NULL
};
typedef struct device_info *PDEV_INFO;
我尝试使用它运行,并创建了如下结构:

[StructLayout(LayoutKind.Sequential)] public struct PDEV_INFO
{
        unsafe void* dev_handle;
        unsafe char* product_string;
        unsafe char* serial_string;

}

我的程序崩溃了,我尝试使用这些类型中的任何一种。如何在C#中定义这些类型,或者如何从.h文件中引用类型?更好的方法是在.DLL中的某个地方定义类型,我只是不知道。谢谢。

试试IntPtr而不是指针。IntPtr是为编组而设计的,而c#指针不是。 此外,您可能还想了解字符串编组。你真的不需要自己去做

尝试将您的类型声明为:

[StructLayout(LayoutKind.Sequential)] 
public struct PDEV_INFO
{
        IntPtr dev_handle;
        [MarshalAs(UnmanagedType.LPWStr)] 
        String product_string;
        [MarshalAs(UnmanagedType.LPWStr)] 
        String serial_string;

}

你是如何使用这些类型的?比如:[StructLayout(LayoutKind.Sequential)]public struct PDEV_INFO{unsafe IntPtr*dev_handle;unsafe IntPtr*product_string;unsafe IntPtr*serial_string;}不,没有指针。指针是非常非c的-你应该(几乎)总是避免它们。我更新了我的答案给你一个想法。