我想用C#调用VC++DLL中的某个返回int*类型的函数,请问在C#中如何得到函数返回值,即整数数组的每个成员?

如题所述

在C#中如果只用指针的话,需要用到unsafe关键字
[DllImport(XXX.dll)]
unsafe private extern static int* 函数名();
unsafe private void 函数名()
{
int* nP = 函数名();
int n = *nP;
nP++;
}
函数名是你DLL中的函数名
通过指针运算符,访问每一个元素,前提是你得知道数组里有多少个元素追问

我知道unsafe可以,不过如果用IntPtr类型代替int*返回类型作为C#中包装的函数的返回值,得到的是一个整数值,我猜想可能是地址,是否可以利用这个地址直接得到数组的值??初学C#求指教!

追答

如果用IntPtr类型也是可以的,可以使用Marshal.ReadInt32方法来从指定地址读取一个四个字节的Int32类型的变量
IntPtr nP;
Marshal.ReadInt32(InP);
读取下一个Int32类型的变量的时候,需要更新一下地址
nP += Marshal.Sizeof(typeof(Int32));
Marshl.ReadInt32(nP);

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-03-21
如果只有指针在C#中,需要使用unsafe关键字
对我有用[0(XXX.DLL)]

不安全的私有外部静态int *函数名();

不安全的私人void的函数名称()

{

* NP =函数名();

廉政n = * NP的

NP + +;

} BR />函数名是您在DLL中的函数
通过指针操作符来访问每个元素的名称,前提是你必须知道数组中的元素的数量
第2个回答  2013-02-26
c# 调用c++ dll 返回值为数组指针
如果c++dll的函数返回值为 数组指针,c#这边我需要怎么定义函数,怎么接收呢?
c++ 原型:
_declspec (dllexport) int* shuju()

C# code
[DllImport("xxxxx.dll")]
public static extern IntPtr shuju();

再使用这个:
Marshal.Copy(IntPtr,Int32[], Int32, Int32)

将数据从非托管内存指针复制到托管Int32数组。

public static void Copy (
IntPtr source,
int[] destination,
int startIndex,
int length
)

然后就和用普通数组一样了

上一个回答的方法也不错

但是面临一个共同的问题,没办法知道数组的长度

我想用C#调用VC++DLL中的某个返回int*类型的函数,请问在C#中如何得到...
在C#中如果只用指针的话,需要用到unsafe关键字 [DllImport(XXX.dll)]unsafe private extern static int* 函数名();unsafe private void 函数名(){ int* nP = 函数名();int n = *nP;nP++;} 函数名是你DLL中的函数名 通过指针运算符,访问每一个元素,前提是你得知道数组里有多少个元素 ...

C#程序调用c++的dll,怎样把dll中函数返回的数组赋值给c#程序中的...
或者可以在DLL 里面再写一个函数int getSize() 返回数组的长度:C++代码:static int size = 0;int getSize(){ return size;}char *A(char buf[]){ char buffer[50]={}; while(buf[i] != '\/0' && i < 49) { buffer[i] = buf[i] size++; } return buffer;}C#代码:C# 代码:unsafe{ char*...

求助:C# 调用C++的dll的回调函数的结构体数组的问题,为什么只得到数组的...
楼主在 C# 中声明这个导出函数时,使用了并不对应的 CardEvent[] C# 数组类型。正确的做法是: 在 C# 声明 lpOnRecvCardEvent 时,第二个参数应该是 IntPtr ,不是数组。由于楼主的这个 VC DLL 可能是自己写的,我没办法给出正确代码。我提供一份模拟代码做参考:--- VC DLL:StructMod.h prag...

C++builder实现函数的回调
实际上是声明了一个返回值为int,传入参数为两个int的指向函数的指针。由于C++和PASCAL编译器对参数入栈和函数返回的处理有可能不一致,把函数类型用WINAPI(WINAPI宏展开就是__stdcall)或stdcall统一修饰。二:声明回调函数原形 声明函数原形 vc版 int WINAPI CBFunc(int Param1,int Param2);Delphi版...

C# 调用 VC++写的 dll,调用几次后就会出错:System.AccessViolationExcept...
vc++写dll供其他语言调用,声明函数时应该使用:extern "C" _declspec (dllexport) int invoke( );还要注意传入的参数和返回值类型,c#中是否存在,必要时进行适当的转换 参数可以用引用,如invoke( LPTSTR &buffer); 在C#中调用时直接传入string类型就可以了 ...

c#如何调用C++中的类
基本上回答是调不了,原因来自引用名和调用约定两方面。这个需要从VC++导出类的原理说起。类从本质上来说是数据结构和封装的操作两部分。数据结构定义在头文件当中,编译的时候就可以访问到;而成员函数是从DLL中导出的。导出C++类库的时候,这些函数名字会按照编译器的标准做一个扩展,比如说 class B{...

我想在程序中显示调用dll中的一个函数,使用GetAddress获得函数入口...
举个例子,比方说你已经知道你要调用的动态连接库中的函数有一个整型参数,而且没有返回值,那你就可以 1. 事先进行如下类型定义:typedef void (*MYPROC)(int);2. 在你的程序里定义一个该类型的函数指针:MYPROC ProcAdd;3. 调用GetProcAddress时把它返回的地址强制类型转换成你定义的类型:Proc...

请问C++如何调用DLL文件里的东西?
typedef int(* lpAddFun)(int,int); \/\/宏定义函数指针类型 typedef int(* lpSubFun)(int,int);lpAddFun addFun; \/\/函数指针 lpSubFun subFun;int * num;if(hDll!=NULL) \/\/判断dll加载是否成功 { addFun=(lpAddFun)GetProcAddress(hDll,"add"); \/\/获取想要引入的函数以及变量 subFun=(...

c#中的char 怎么用?
一个字符,属于整形。char a = 'a';char b = a;char c = (char)97;Response.Write( "a = " + a + "<BR \/>b = " + b + "<BR \/>c = " + c );很少用,因为.Net类库已经非常强大,而且不怎么开发底层程序,似乎不用也完全可以了。

使用VC++编写的dll文件中的错误
dllimport是引入函数。如果要引入函数的话,必须有对应的.H和.LIB文件。如果是输出,则要在#ifdef test11_EXPORTS之前加上#define test11_EXPORTS

相似回答