2 hjw1197052444 hjw1197052444 于 2016.03.29 10:53 提问

关于C# 调用 C++ 的DLL 的问题! 5 分!

C++ 代码:
构造体:
enum usb_relay_device_type
{
USB_RELAY_DEVICE_ONE_CHANNEL = 1,
USB_RELAY_DEVICE_TWO_CHANNEL = 2,
USB_RELAY_DEVICE_FOUR_CHANNEL = 4,
USB_RELAY_DEVICE_EIGHT_CHANNEL = 8

};

/*usb relay board info structure*/
struct usb_relay_device_info
{
    unsigned char *serial_number;
    char *device_path;
    usb_relay_device_type type;
};
C++ 调用方法名称:
struct usb_relay_device_info EXPORT_API * usb_relay_device_enumerate(void);
============================================
C# 构造体代码:
public class Cstruct
{
   public enum usb_relay_device_type
{
    USB_RELAY_DEVICE_ONE_CHANNEL = 1,
    USB_RELAY_DEVICE_TWO_CHANNEL = 2,
    USB_RELAY_DEVICE_FOUR_CHANNEL = 4,
    USB_RELAY_DEVICE_EIGHT_CHANNEL = 8  
};
   [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
    public struct usb_relay_device_info
 {
     public IntPtr serial_number;
     public IntPtr device_path;
     public usb_relay_device_type type;
            }
}
C# 调用C++ DLL 方法

             private void button1_Click(object sender, EventArgs e)
    {
         //查找设备
    [DllImport("usb_relay_device.dll", EntryPoint = "usb_relay_device_enumerate", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
    public static extern Cstruct.usb_relay_device_info usb_relay_device_enumerate();
        //查找设备
        Cstruct.usb_relay_device_info cs1 = usb_relay_device_enumerate();       
    }

问:1 我现在的问题是 cs1 取到的值都为0,不会报错
2是不是我C# 的构造体返回类型不应该是 IntPtr。因为在C++ 中是指针的形式,所以在C# 不知道如何定义

3个回答

CSDNXIAOD
CSDNXIAOD   2016.03.30 11:30

C#调用C++的DLL各种问题
C#调用C++的dll问题
C# 调用 C++ dll 的一些问题
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

xxdddail
xxdddail   2016.03.30 15:44

c#中定义的结构体不合适,这种接法一般不宜在struct内部再定义IntPtr来接收数据,这样会导致数据丢失。
可以考虑两种方式,一定是在struct中将IntPtr定义转换为byte数组接收。
或者直接以byte数组来接收,然再再byte数组转换为结构体。

xxdddail
xxdddail   2016.03.30 15:44

c#中定义的结构体不合适,这种接法一般不宜在struct内部再定义IntPtr来接收数据,这样会导致数据丢失。
可以考虑两种方式,一定是在struct中将IntPtr定义转换为byte数组接收。
或者直接以byte数组来接收,然再再byte数组转换为结构体。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
2017.10.11 C#调用C++ 动态库内存溢出问题
最近在写C#调用C++ 动态库的例子,发现使用Stringbuider 时,重复使用时容易造成内存溢出的问题,网上查了之后 发现可以使用 Stringbuider .Remove(0, Stringbuider .Length)方法,但是经过测试后并没有解决问题。 后来经过仔细分析,发现使用 StringBuilder cRegResult = new StringBuilder(512);
将C语言编译成DLL并用C#进行调用以及关于从C#传输中文路径到C的DLL中打开文件的问题
动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是window系统的基石。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。从语言方面来说就是可以在一定程度上使不同的语言之间实现相互调用。
c#调用C/C++代码时出现的PInvokeStackImbalance异常实例及解决方式
c#中调用c/C++的dll时,需要加上CallingConvention特性参数,否则容易出现PInvokeStackImbalance异常
C#调用C的Dll(类型对照)
转: C#调用C的Dll(类型对照) //C++中的DLL函数原型为   //extern "C" __declspec(dllexport) bool 方法名一(const char* 变量名1, unsigned char* 变量名2)   //extern "C" __declspec(dllexport) bool 方法名二(const unsigned char* 变量名1, ch
C# 调用C写的DLL时 对应的char* 类型转化为 ref byte
C中代码: void read( char *filename ) { ....... } C#中代码: [DllImport("myC.dll", EntryPoint = "read", CharSet = CharSet.Auto)] public static extern void read(ref byte filename);调用示例: string name = @
C#调用C/C++的dll须知
1. C#类型与C/C++类型的对应关系 基本数据类型(C# <—> C/C++) System.Int32,int <—> int, long System.Int64,int64 <—> long long, __int64 System.Char, char <—> char, byte, unsigned char System.Int16, short <—>
C#调用DLL的几种方法,包括C#调用C\C++\C#DLL
C#中dll调用方法 一、      DLL与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文件,Windows就是将一些主要的系统功能以DLL模块的形式实现。 动态链接库是不能直接执行的,也不能接收消息,它只是一个
c#调用c语言dll,形参有char*
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.W
C# 调用C/C++ DLL库的回调函数
1、在 C/C++端 定义一个函数指针 Typedef void (*TESTBACK)(int a, int b); 定义一个带函数指针的函数 __declspec(dllexport int add(TESTBACK ptsTestBack, int a, int b) { return ptsTestBack(a, b); } 2、C# 端 声明回调函数的委
C#发射调用dll的事件
主要是C#来实现主程序实现插件的事件。也就是插件的dll里定义了事件,事件触发的时候反给调用插件的主程序。