Metro C#中调用C++中的DLL
2013-01-03 20:17
232 查看
g10589119在【windows8开发】深入浅出C++/CX一文中提出了一下这个问题,特以此文进行回复,大家如果有不同意见和想法可以留言分享下。g10589119的问题如下:
----------------------------------------------------------------------------------------------
From g10589119
楼主你好,最近遇到一个问题,就是在metro的开发中,想用c#调用C++ /CX写的DLL,
[cpp] view plaincopy
public ref class test_class sealed
{
public:
void fun(int a, int& b,int c[10])
{
....
}
};
类似上面的函数,从C#中如何调用,数组和引用的参数不知在C#中怎么传递。
----------------------------------------------------------------------------------------------
首先上面的代码编译时应该会有问题,因为在C++ CX中,public类中的所有public方法参数必须使用WinRT支持的类型,有些C++原生的类型并不支持,比如int&。另外如果是要传递数组的话,也不能以上面的这种方式,C++中上面的传递只等同于传递了int*,而多语言交互时,比如C#调用C++,是不能用来传递数组的。
那么C++里类似的接口应该怎么来实现呢?
C++类中可以声明为:
[cpp] view plaincopy
void fun(int a, int* b, Platform::Array<int>^ c);
由于WinRT对外的public类的方法参数不支持C++原生的引用int&,所以如果要实现类似功能可以用int*,其实MSDN中提到有Windows::Foundation::IReference<int>这个类似引用的类型,但是在我的VS2011环境中暂时找不到这个类型的定义,编译通不过,暂时用不了。而数组的参数可以用Platform::Array<int>^类型。我随便写了些处理如下所示:
[align=left] [/align]
[cpp] view plaincopy
int fun(int a, int* b, Platform::Array<int>^ c) {
int sum = 0;
(*b) = 5;
for (int i = 0; i < c->Length; i++) {
sum += c[i];
}
return sum * a + (*b);
}
C#怎么调用呢?本人对C#.Net不是很擅长,只是做了下尝试,可以如下调用:
[align=left] [/align]
[csharp] view plaincopy
test_class test= new test_class();
int a = 2;
int b = 0;
int[] c = new int[5]{1,2,3,4,5};
int x = test.fun(a, out b, a);
[align=left] [/align]
[align=left]第一个参数是整型,直接传递int数值就可以,第二个参数在C++方法中是int*,映射到C#中就应该是out int,所以我们可以使用C#中的out关键字来传递b,最后一个参数是数组,可以直接传递C#中的数组类型。[/align]
[align=left] [/align]
[align=left]关于WinRT下多语言交互调用是接口参数其实还有很多问题,有时间的话会整理下另外再写篇文章来说明,本文只是简单解决一下“g10589119”留言提的问题。[/align]
[align=left] [/align]
[align=left]原文地址[/align]
----------------------------------------------------------------------------------------------
From g10589119
楼主你好,最近遇到一个问题,就是在metro的开发中,想用c#调用C++ /CX写的DLL,
[cpp] view plaincopy
public ref class test_class sealed
{
public:
void fun(int a, int& b,int c[10])
{
....
}
};
类似上面的函数,从C#中如何调用,数组和引用的参数不知在C#中怎么传递。
----------------------------------------------------------------------------------------------
首先上面的代码编译时应该会有问题,因为在C++ CX中,public类中的所有public方法参数必须使用WinRT支持的类型,有些C++原生的类型并不支持,比如int&。另外如果是要传递数组的话,也不能以上面的这种方式,C++中上面的传递只等同于传递了int*,而多语言交互时,比如C#调用C++,是不能用来传递数组的。
那么C++里类似的接口应该怎么来实现呢?
C++类中可以声明为:
[cpp] view plaincopy
void fun(int a, int* b, Platform::Array<int>^ c);
由于WinRT对外的public类的方法参数不支持C++原生的引用int&,所以如果要实现类似功能可以用int*,其实MSDN中提到有Windows::Foundation::IReference<int>这个类似引用的类型,但是在我的VS2011环境中暂时找不到这个类型的定义,编译通不过,暂时用不了。而数组的参数可以用Platform::Array<int>^类型。我随便写了些处理如下所示:
[align=left] [/align]
[cpp] view plaincopy
int fun(int a, int* b, Platform::Array<int>^ c) {
int sum = 0;
(*b) = 5;
for (int i = 0; i < c->Length; i++) {
sum += c[i];
}
return sum * a + (*b);
}
C#怎么调用呢?本人对C#.Net不是很擅长,只是做了下尝试,可以如下调用:
[align=left] [/align]
[csharp] view plaincopy
test_class test= new test_class();
int a = 2;
int b = 0;
int[] c = new int[5]{1,2,3,4,5};
int x = test.fun(a, out b, a);
[align=left] [/align]
[align=left]第一个参数是整型,直接传递int数值就可以,第二个参数在C++方法中是int*,映射到C#中就应该是out int,所以我们可以使用C#中的out关键字来传递b,最后一个参数是数组,可以直接传递C#中的数组类型。[/align]
[align=left] [/align]
[align=left]关于WinRT下多语言交互调用是接口参数其实还有很多问题,有时间的话会整理下另外再写篇文章来说明,本文只是简单解决一下“g10589119”留言提的问题。[/align]
[align=left] [/align]
[align=left]原文地址[/align]
相关文章推荐
- c++调用vb6.0制作的activex dll
- C#调用C++DLL
- 编写C#调用的C++DLL
- C#调用C++的DLL搜集整理的所有数据类型转换方式
- C++调用C#生成的DLL实现及注意事项
- C# 中调用C++ DLL (P/Invoke)
- C++调用dll例子
- C++工程代码打包的dll在C#工程上使用注意点!变量对应关系与dll调用出错情况。
- C++调用C#之C++DLL调用C# COM控件
- C#调用C++ DLL相关问题
- C# 调用C++dll中的结构体的定义
- C# 调用C++生成的dll
- C++写dll文件用C#调用
- C++ 调用DLL方法
- C#调用C/C++ 动态链接库DLL(四) -- 调用C++类
- VB.net中调用C\C++ 的DLL
- C#调用C++写的dll,C++调用C++的dll
- C#调用C++的dll
- C#调用C++dll