2 zhuwt2008 zhuwt2008 于 2015.07.04 00:23 提问

c#调用c++dll函数时参数传递的问题?怎样正确传值?

在c++项目cpptest.dll中定义:
struct A
{
int X;
int Y;
};

extern "C" __declspec(dllexport) int fun1(A *a);

int fun1(A *a)
{
return a->X;
}

在C#项目中定义:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
class A
{
public int X;
public int Y;
}

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate int dofun(ref A a1);   

class Program
{
    static void Main(string[] args)
    {
        //1. 动态加载C++ Dll
        int hModule = NativeMethod.LoadLibrary("cpptest.dll");
        if (hModule == 0) return;
        //2. 读取函数指针
        IntPtr intPtr = NativeMethod.GetProcAddress(hModule, "fun1");
        //3. 将函数指针封装成委托
        dofun dofun1 = (dofun)Marshal.GetDelegateForFunctionPointer(intPtr, typeof(dofun));

        A a1 = new A();
        a1.X = 1;
        a1.Y = 2;
        Console.WriteLine(dofun1(ref a1));
    }
}

为什么每次运行输出都不相同,且数字不是1也不是2,而是类似7825552,14052168,21507032?该如何修改呢?

1个回答

zhuwt2008
zhuwt2008   2015.07.04 09:34
已采纳

class A换成struct A

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C#调用C++编写的DLL函数, 以及各种类型的参数传递
1. 如果函数只有传入参数,比如: C/C++ Code Copy Code To Clipboard //C++中的输出函数 int __declspec(dllexport) test(const int N) { return N+10; } 对应的C#代码为: C# Code Copy Code To Clipboard [DllImport(
C#调用C函数(DLL)传递参数问题
备忘: 1.C函数参数为字符串char*。如果是入参,对应C#中string或StringBuilder;如果是出参对应C#中StringBuider;   2.C函数参数为结构体指针,需在C#中对应定义结构体。如果是入参,C#中可为myfunction(MyStruct mystruct)或myfunction(ref MyStruct mystruct);如果是出参,C#中为
C#中调用非托管的DLL及参数传递 (一)
微软的.NET框架的优点之一是它提供了独立于语言的开发平台。你可以在VB、C++、C#等语言中编写一些类,而在其它语言中使用(源于.NET中使用了CLS),你甚至可以从另一种语言编写的类中继承。但是你要是想调用以前的非托管DLL,那又会怎么样呢?你必须以某种方式将.NET对象转换为结构体、char *、函数指针等类型。这也就是说,你的参数必须被marshal(注:不知道中文名称该叫什么,英文中
C#中调用非托管的DLL及参数传递
    微软的.NET框架的优点之一是它提供了独立于语言的开发平台。你可以在VB、C++、C#等语言中编写一些类,而在其它语言中使用(源于.NET中使用了CLS),你甚至可以从另一种语言编写的类中继承。但是你要是想调用以前的非托管DLL,那又会怎么样呢?你必须以某种方式将.NET对象转换为结构体、char *、函数指针等类型。这也就是说,你的参数必须被marshal(注:不知道中文名称该叫什么,英文中指的是为了某个目的而组织人或事物,参见这里,此处指的是为了调用非托管函数而进行的参数转换)。     C#
c# 调用C++编写 的DLL函数各种参数传递问题。
c# 调用C++编写 的DLL函数各种参数传递问题。数据处理问题等等。
C#调用C++编写的DLL函数各种参数传递
C#调用C++编写的DLL函数各种参数传递
c#调用delphi开发的dll的指针参数
在c#中调用DELPH编写的DLL的函数时出现未将对象引用到实例的错误: delphi编写的dll中函数声明:function DeliverfromEsm(var Smtype, Content,Caller:pchar):integer; Content:短信内容或报告(若Smtype为即时消息或离线消息,则Content表示短信内容;否则,Content表示返回的状态报告情况);   C
C# 调用Dll 传递字符串指针参数
用C#调用VC写的dll,传递参数给dll,如果是非托管代码,调用起来有点麻烦。所以把把参数转换成非托管代码的指针参数,然后再传递给dll。 using System.Runtime.InteropServices; //操作Dll的类空间 class CGicomIndex { [DllImport("Index_dll.dll")] un
C#调用dll问题
C#调用dll问题的解决办法,C#写的dll在其他语言中互相调用解决方法
C# 调用dll 回调函数
C/C++内回调函数一般通过传递函数指针来实现,函数指针在C#中对应的就是委托.   Cpp代码   // 传入函数指针  typedef void (*FUNC)(int,char*);  JNAAPI bool processCallback(int a,FUNC func);   // 传入函数指针 typedef void (*FUNC)(int,char*