继电器-关于C# 调用 C++ 的DLL 的问题! 5 分!

问题描述

关于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# 不知道如何定义

解决方案

C#调用C++的DLL各种问题
C#调用C++的dll问题
C# 调用 C++ dll 的一些问题

解决方案二:

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

解决方案三:

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

时间: 2024-11-10 01:07:46

继电器-关于C# 调用 C++ 的DLL 的问题! 5 分!的相关文章

C#/C++/CLI运行效率测试之二 Native C++调用Native C++ DLL

本文分为两方面 一.Native C++调用Native C++ DLL 并测试运行时间 二. 完全由C# 实现运算代码 并测试运行时间 详细过程: 一: 至于如何获取EfficiencyNativeCPPDLL.dll 和 EfficiencyNativeCPPDLL.lib 以及生成项目EfficiencyNativeCPPDLL 本文讲述在VS2010中本地C++调用C++类库以进行效率测试 1. 常见Win32控制台应用程序 ConsoleCPPInvokeDLL 2.选择下一步点击完成

com-C++ 如何调用Delphi的dll文件中的COM方法

问题描述 C++ 如何调用Delphi的dll文件中的COM方法 请问 C++ 如何 调用 Delphi 的dll文件中的COM方法 解决方案 只要是COM就遵守COM的规范,Delphi写出来的COM和其他语言写出来的COM用法是一样的

c++-【下跪】PB调用C的DLL报错

问题描述 [下跪]PB调用C的DLL报错 一下是文档中的结构体: typedef struct{byte Track2[37]; /*二磁道信息 ,asc格式 最长37个字节 */byte Track3[104]; /*三磁道信息 asc 格式 最长 104个字节*/byte Pwd[8]; /*加密后的密码 8个字节 */byte Amount[12]; /* 金额, 分为单位000000000001 代表1分不允许0金额积分兑奖时为积分*/byte Trace[6]; /* 终端流水,不是动

dll c#-c#调用c++的dll出现尝试读取或写入受保护的内存问题

问题描述 c#调用c++的dll出现尝试读取或写入受保护的内存问题 使用c#调用c++的一个dll.c++的接口函数为: extern "C" __declspec(dllexport)bool __stdcall CreateDetmObject(IDetManager **ppDetManager); 参数IDetManager为一个结构体: struct IDetManager { virtual void __stdcall SetListener(HWND hWnd) = 0

.net-C#调用c++的dll执行带字符串参数的函数时遇到的问题

问题描述 C#调用c++的dll执行带字符串参数的函数时遇到的问题 我在c++项目中实现函数: extern "C" __declspec(dllexport) int FUNC1(const char* xmlSta, char* fileOut) { return 0; } 然后编译成动态库a.dll,并在C#项目中引用, 用静态加载的方式,是可以运行的,代码如下(只写调用的部分): [DllImport("a.dll", EntryPoint = "

swmm dll-怎样C#调用swmm的dll

问题描述 怎样C#调用swmm的dll 自己做了一个ARCGIS二次开发界面,结合swmm软件进行管网分析,现在已经实现shp转 inp,但是不会读取swmm分析后的输出文件即out 文件,它是二进制文件,不会读取,现在 需要读取out文件,并添加到自己设计的界面中的属性表中,在设计的界面中显示地图,并能查询积水情况,谢谢大家! 解决方案 ?????每种编程语言调用DLL的方法都不尽相同,在此只对用C#调用DLL的方法进行介绍.首先,您需要了解什么是托管,什么是非托管.一般可以认为:非托管代码主

c# dll-c#调用C++的DLL时调用失败

问题描述 c#调用C++的DLL时调用失败 本人C#小白.老大要求用C#调用C++的DLL.C++的我写出来了,可以调用成功.#include #include void main(){ HMODULE hModule = ::LoadLibrary(_T(""C:CT_InfoTerm.dll"")); typedef LONG (WINAPI pDLLProc)(intcharintintintchar*int); pDLLProc dllfunc; int i

c语言-VB 调用crc16校验 dll 返回值不正确

问题描述 VB 调用crc16校验 dll 返回值不正确 真诚求助,其实什么都写好了就是关键时候掉链子了 如下: C语言写的CRC16 半字节查表 方式校验,dll cpp 程序如下: unsigned short _stdcall CalCRC16(unsigned char *ptr, unsigned char len) { unsigned short crc; unsigned char da; unsigned short crc_ta[16]={ 0x0000,0x1021,0x2

activex-C#开发ActiveX控件调用动态库DLL

问题描述 C#开发ActiveX控件调用动态库DLL 我想开发一个C# ActiveX控件调用动态库DLL,能够在网页中使用,创建ActiveX控件我已经完成了,但调用DLL动态库没有相应的反馈给我,就像没有做任何操作一样,网上说把动态库DLL放到windows/System32下面,可以调用成功,但我照做了,还是没有反应,我的系统是WIN732位,动态库DLL在C/S程序下调用是没有问题,希望高人帮忙解答下,如果对问题有什么不明白之处,可以留言,谢谢 解决方案 ActiveX控件需要注册(命令