Metro C#中调用C++中的DLL

简介:
g10589119【windows8开发】深入浅出C++/CX一文中提出了一下这个问题,特以此文进行回复,大家如果有不同意见和想法可以留言分享下。g10589119的问题如下:
----------------------------------------------------------------------------------------------
From g10589119
楼主你好,最近遇到一个问题,就是在metro的开发中,想用c#调用C++ /CX写的DLL,
[cpp]  view plain copy
  1. public ref class test_class sealed  
  2. {  
  3. public:  
  4. void fun(int a, int& b,int c[10])  
  5. {  
  6. ....  
  7. }  
  8. };  
类似上面的函数,从C#中如何调用,数组和引用的参数不知在C#中怎么传递。
----------------------------------------------------------------------------------------------
 
首先上面的代码编译时应该会有问题,因为在C++ CX中,public类中的所有public方法参数必须使用WinRT支持的类型,有些C++原生的类型并不支持,比如int&。另外如果是要传递数组的话,也不能以上面的这种方式,C++中上面的传递只等同于传递了int*,而多语言交互时,比如C#调用C++,是不能用来传递数组的。
 
那么C++里类似的接口应该怎么来实现呢?
C++类中可以声明为:
[cpp]  view plain copy
  1. void fun(int a,  int* b, Platform::Array<int>^ c);  
由于WinRT对外的public类的方法参数不支持C++原生的引用int&,所以如果要实现类似功能可以用int*,其实MSDN中提到有Windows::Foundation::IReference<int>这个类似引用的类型,但是在我的VS2011环境中暂时找不到这个类型的定义,编译通不过,暂时用不了。而数组的参数可以用Platform::Array<int>^类型。我随便写了些处理如下所示:
 
[cpp]  view plain copy
  1. int fun(int a,  int* b, Platform::Array<int>^ c) {  
  2.      int sum = 0;  
  3.      (*b) = 5;  
  4.      for (int i = 0; i < c->Length; i++) {  
  5.           sum += c[i];  
  6.      }  
  7.      return sum * a + (*b);  
  8. }  
 
C#怎么调用呢?本人对C#.Net不是很擅长,只是做了下尝试,可以如下调用:
 
[csharp]  view plain copy
  1. test_class test= new test_class();  
  2. int a = 2;  
  3. int b = 0;  
  4. int[] c = new int[5]{1,2,3,4,5};  
  5. int x = test.fun(a, out b, a);  
 
第一个参数是整型,直接传递int数值就可以,第二个参数在C++方法中是int*,映射到C#中就应该是out int,所以我们可以使用C#中的out关键字来传递b,最后一个参数是数组,可以直接传递C#中的数组类型。
 
关于WinRT下多语言交互调用是接口参数其实还有很多问题,有时间的话会整理下另外再写篇文章来说明,本文只是简单解决一下“g10589119”留言提的问题。
 


本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/archive/2013/01/03/2843304.html,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
C#
C# 解决引用dll,出现dll不可以使用等问题
C# 解决引用dll,出现dll不可以使用等问题
|
2月前
|
数据处理 C# C++
如何使用C#和C++结构体实现Socket通信
如何使用C#和C++结构体实现Socket通信
106 0
|
2月前
|
C++ 数据格式
LabVIEW传递接收C/C++DLL指针
LabVIEW传递接收C/C++DLL指针
87 1
|
1月前
|
Java Go C#
编程语言C#、C++、Java、Python、go 选择哪个好?
我想说的是,不论选择哪种编程语言,决定选择的都是你最终的目的,做选择之前,先充分调研每一个选择项,再做选择思路就会非常清晰了。
49 3
|
29天前
|
安全 编译器 API
程序与技术分享:C#调用DLL的几种方法
程序与技术分享:C#调用DLL的几种方法
21 0
|
1月前
|
程序员 C# C++
lpszBlogName C#开发多年中途被迫改行C++但工作中又经常偷偷使用C#的C++程序员
通过AUMID解析出packageFamily,再根据PackageManager解析出安装目录 PackageManager是WinRT的类型,如何在c++中使用WinRT,请参考C++/WinRT 以下代码需要管理员权限才能运行。
|
1月前
|
Java API Android开发
Java通过JNI调用C++的DLL库
Java通过JNI调用C++的DLL库
16 0
|
2月前
|
开发框架 .NET C#
浅谈c和c++和c#之间的关系
浅谈c和c++和c#之间的关系
42 0
|
2月前
|
XML 缓存 算法
C#非强签名dll搜索顺序
C#非强签名dll搜索顺序
|
2月前
|
C++
【C++】C++封装成DLL并调用(初学者快速入门)
【C++】C++封装成DLL并调用(初学者快速入门)