在C++中反射调用.NET的方法(一)分享

所有的.NET引用类型,在使用的时候,都必须在类型免费精选名字大全后加 ^ 符号,例如下面定一个.NET字符串类型变量:

  String^ assemblyFile; 

带^符号的变量,在C++/CLI中称为 “句柄”对象,用来跟C++本地代码的“指针”相区别。

在C++中,类的成员用 -> 符号调用,命名空间或者类的静态成员,用::调用,例如上面的构造函数中的代码:

  Assembly^ ass = Assembly::LoadFrom(this->assemblyFile);

 注意:在本例中需要.NET类库项目引用 PDF.NET SOD框架,在项目的“管理Nuget程序包”里面搜索 PDF.NET.SOD.Core 添加此引用即可。
学会了这些C++的基础语法,那么编写C++/CLI代码就没有主要的障碍了。

在C++/CLI中使用反射

反射调用第一个.NET类的方法

下面的方法,将会反射调用 User类的一个最简单的方法 :

  public int GetUserID(string IdString){}

该方法只有一个一个参数和一个简单的返回值,下面是C++/CLI的反射调用代码:

  int GetUserID(String^ iDstring)  {    MethodInfo^ method = this->dotnetObject->GetType()->GetMethod("GetUserID", BindingFlags::Public | BindingFlags::Instance);    Func<String^, int>^ fun = (Func<String^, int>^)Delegate::CreateDelegate(Func<String^, int>::typeid, this->dotnetObject, method);    int result = fun(iDstring);        return result;  }

注意这里创建了一个 Func<String,int>的委托方法,使用委托能够简化我们的反射调用并且有时候还能够提高效率,在这段代码中,有1个要注意的地方:

  Func<String^, int>::typeid

这是C++/CLI特殊的语法,表示获取“句柄”类型的类型ID,实际上它的结果就Type对象,等同于C#的
typeof(Func<string,int>)

PS:非常遗憾的是,typeid方式,没法得到下面类型的类型值:
typeof(Func<,>),这给我们在动态构造泛型对象的时候造成了很大的困惑。

再看一个简单方法的反射:

  DateTime GetUserBirthday(int userId)      {        MethodInfo^ method = dotnetObject->GetType()->GetMethod("GetUserBirthday", BindingFlags::Public | BindingFlags::Instance);        Func<int, DateTime>^ fun = (Func<int, DateTime>^)Delegate::CreateDelegate(Func<int, DateTime>::typeid, this->dotnetObject, method);        DateTime result = fun(userId);        return result;      }

注意:由于DateTime是值类型,因此在进行类型申明的时候,不需要加^符号,仅需要对Func委托加上^句柄标记。

有了这2个简单的方法,我们来看看如何调用这个.NET方法“代理类”: 

   NetLibProxy::UserProxy^ proxy = gcnew NetLibProxy::UserProxy("..\NetLib\bin\Debug\NetLib.dll");    int result= proxy->GetUserID("123456");    DateTime date = proxy->GetUserBirthday(result);    System::Console::WriteLine("C++/CLI .Net Proxy Class Call Test Result:rn UserID={0},rn Birthday={1}",       result,date.ToShortDateString());

OK,第一个C++/CLI代码调用成功,而且还是反射调用的,心情小激动一下。

有关C++/CLI的反射,委托的详细资料,可以参考MSDN的介绍:

https://msdn.microsoft.com/zh-cn/library/2x8kf7zx.aspx 使用 C++ 互操作(隐式 PInvoke)
https://msdn.microsoft.com/zh-CN/library/213x8e7w.aspx 泛型委托

在下一篇,我们将继续探究C++/CLI 反射调用.NET中可能遇到”深坑”,因此仅打算吧本篇文章作为一个“入门”,免得大家心生恐惧,错过了挑战艰险的机会。

以上所述是小编给大家介绍的在C++中反射调用.NET的方法(一),希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/487831.html

(0)
上一篇 2020年11月12日
下一篇 2020年11月12日

精彩推荐