2 van xfx van_xfx 于 2016.05.07 11:05 提问

请问这个C++的dll在C#中怎么调呀?急……在线等!

C++中的调用:
extern "C" _declspec(dllimport) int ReadGzjzzData(char* pData,char* photo,int * iErrCode);

void CReadGzjzzDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
// OnOK();
char Data[64*1024] = {0};//各字段用双竖“||”分隔。
char photo[10*1024] = {0};
int iErrCode = 0;
BOOL ret = ReadGzjzzData(Data,photo,&iErrCode);
if(ret)
{
//数据保存操作
}
}
C#中是怎样的呢???

6个回答

van_xfx
van_xfx   2016.05.14 12:17
已采纳

已解决,谢谢各位。我解决如下:
[DllImport("Gzjzz.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern Int32 ReadGzjzzData(IntPtr data, IntPtr photo, ref int iErrCode);

    public static int GPReadGzjzzData(ref string datastr, ref string photostr, ref int iErrCode)
    {
        int ERROR = 0;
        IntPtr data = Marshal.AllocHGlobal(64 * 1024);
        IntPtr photo = Marshal.AllocHGlobal(10 * 1024);
        int ret = ReadGzjzzData(data, photo, ref ERROR);
        datastr = Marshal.PtrToStringAnsi(data);
        photostr = Marshal.PtrToStringAnsi(photo);
        Marshal.FreeHGlobal(data);
        Marshal.FreeHGlobal(photo);
        return ret;
    }
qq_34912380
qq_34912380   2016.05.07 11:16

public partial class CReadGzjzzDlg
{
public void OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
// OnOK();
sbyte[] Data = new sbyte[64 * 1024]; //各字段用双竖"||"分隔。
sbyte[] photo = new sbyte[10 * 1024];
int iErrCode = 0;
int ret = ReadGzjzzData(Data, photo, iErrCode);
if (ret != 0)
{
//数据保存操作
}
}
}

van_xfx
van_xfx   2016.05.07 11:49

对应dllimport怎么声明?

van_xfx
van_xfx   2016.05.07 11:54

这样不行,调用时提示:托管调试助手“PInvokeStackImbalance”在“C:\Users\Administrator\Desktop\222\sCardTest\readJzzInfo\bin\Debug\readJzzInfo.vshost.exe”中检测到问题。

showbo
showbo   Ds   Rxr 2016.05.07 12:26
yechang5913
yechang5913   2016.05.08 10:16

[DllImport("你的.dll", EntryPoint = "#1你的第几个导出函数", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern int ReadGzjzzData(StringBuilder pData,StringBuilder photo,IntPtr iErrCode);

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
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/C++ Dll中函数实例代码
实例代码说明如何在托管的C#代码中调用非托管的Win32 API或者自己用C/C++写的Dll中的函数,以及如何传递输入、输出字符串参数,结构类型参数等问题。
C中常用的调试方法、DLL的调试
C中常用的调试方法 调试的最常用的方法,假如我们怀疑一个整形变量x有问题的话,可以:1, CString str;str.Format(“%d”,x);//和printf非常相似MessageBox(str);优点:点确定后程序才会继续运行。缺点:如果次数太多,过于浪费时间和键盘。2,Ctrl+F10运行到光标处,在Watch窗口中name项输入x,,后面会显示值。  优点:简单,可以查看所有的值
C#调C++动态库Dll C++回调C#函数
vs2010 新建项目 / Visual C++ / 类库; 项目名  MyCallbackDll 头文件: 定义类 成员函数 // MyCallbackDll.h #pragma once using namespace System; #ifdef DLL #define DLL_API __declspec(dllexport) #else #define DLL_API #en
C# Csharp 调用 C++的DLL中的回调函数
一个是C++的DLL以及源码 一个是调用他的C#源码 都是VS2010编译测试通过
PB调用C#写的dll文件
C#写的dll文件,直接可以被PB调用,很爽的!声明下,不是源创哦,是在网上找的资料,经过自己的调试,成功!
OJ 刷题 5-3 出租 (20)
OJ刷题,曾经网上很火的一张出租房屋的宣传页
VS2013下在C#中调试C++ dll
dll项目,属性-配置属性-调试-把 命令 为 调用该dll的exe工程的bin\Debug*.exe dll项目,属性-配置属性-调试-把 调试器类型 设置为 仅限本机 dll项目,属性-配置属性-常规-把输出目录设置为 调用该dll的exe工程的bin\Debug目录下 在dll项目中打好断点,然后重新生成dll,输出dll到设置的目录下exe项目,属性-调试-启用本机代码调试 exe项
C++与C#互调dll的实现步骤
本文实例展示了C++与C#互调dll的实现步骤,在进行大型项目共享dll动态链接库中可以用到。具体方法如下: 一、C#调用C++ dll步骤(只能导出方法): 1. c++建立空项目->源文件文件夹中添加cpp文件和函数 2. c++属性设置中,配置类型设置为动态库dll,公共语言运行时支持改为/clr 3. c#引用c++的dll 4. c#声明c++的方法,并添加 DllImport
C#使用C/C++编译的动态链接库dll
C#使用C/C++编译的动态连接库