使用C++/CLI调用C#封装类库

小序:

用C#开发的库,供C#开发人员调用,一切正常。客户:你们的API得支持C++。对于C++小白的我来说,只能含泪恶补C++知识,并且准备使用C++来封装接口的时候突然发现,C#端封装的接口里面使用了第三方的库,C++里面没用对应的库,欲哭无泪的我正准备放弃的时候,山穷水复疑无路,柳暗花明又一村,偶然发现的 C++/CLI完美解决了我的问题。

正文:

这里不准备做C++/CLI的介绍,只是将使用过程中踩过的坑做记录。

使用C++/CLI可以在C++中调用C#封装的dll,在实际使用中,由于数据接口还是C#类型,需要做相应的转换供C++人员使用。这里推荐一款神器:C# to C++ Converter

地址: https://www.tangiblesoftwaresolutions.com/product_details/csharp_to_cplusplus_converter_details.ht

将c#对象转换为c++对象,对于c++小白的我来说无外乎为天降猛男。

使用C++/CLI中遇到的最大的问题莫过于处理System.Object类型的数据,通过C# to C++ Converter 转换为c++代码对应的类型为

void*,查阅资料如何实现void*指针与托管对象System.Object相互转换,发现这条路走不通后。只好采取另外的方法,在c++中使用

byte数组来替代void*,byte数组很容易转托管类型数组array<byte>,通过Mashal::Copy方法即可实现转换。剩下的问题为如何将

c++各种类型的数据转换成byte数组,经过一番摸索,发现借助BitConverter可以很方便完成这一工作,无需面对各种<<  >>位操作。

总结:

对于C#开发人员来说,C++/CLI很容易上手,C# to C++ Converter能够快速帮助掌握对应C++代码,Marshal中包含了托管类型与非托管类型的转换方法。C++/CLI 不足:不支持C# 5中的 async await 异步方法,无法使用lambda表达式。不过想想,如果将C#特性全部移植过来的话不太可能,所以在设计的时候需要尽量规避掉这些特性。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C++/CLI封装ActiveX控件VSFlexGrid的例子: 1. 在Visual Studio中创建一个新的C++/CLI类库项目。 2. 在项目中添加一个新的类,用于封装VSFlexGrid控件。 3. 在该类的头文件中,包含以下代码: ``` #pragma once namespace VSFlexGridWrapper { using namespace System::Runtime::InteropServices; [ComVisible(true)] [ClassInterface(ClassInterfaceType::AutoDispatch)] public ref class VSFlexGridWrapper { public: VSFlexGridWrapper(); void SetRowCount(int count); void SetColumnCount(int count); void SetCellText(int row, int col, System::String^ text); void SetCellBackColor(int row, int col, System::Drawing::Color color); private: // Pointer to the VSFlexGrid ActiveX control System::IntPtr vsflexgridPtr; }; } ``` 4. 在类的实现文件中,使用以下代码来初始化VSFlexGrid控件: ``` #include "stdafx.h" #include "VSFlexGridWrapper.h" namespace VSFlexGridWrapper { VSFlexGridWrapper::VSFlexGridWrapper() { // Instantiate the VSFlexGrid ActiveX control vsflexgridPtr = System::Runtime::InteropServices::Marshal::GetIUnknownForObject(gcnew AxVSFlexLib::AxVSFlexGrid()); } } ``` 5. 在实现文件中添加对VSFlexLib的引用: ``` #using <mscorlib.dll> #using <System.dll> #using <System.Drawing.dll> #using <System.Windows.Forms.dll> #using <System.ComponentModel.dll> #using <AxInterop.VSFlexLib.dll> ``` 6. 实现类中的方法,以便在外部调用: ``` void VSFlexGridWrapper::SetRowCount(int count) { AxVSFlexLib::AxVSFlexGrid^ vsflexgrid = (AxVSFlexLib::AxVSFlexGrid^)System::Runtime::InteropServices::Marshal::GetObjectForIUnknown(vsflexgridPtr); vsflexgrid->Rows = count; } void VSFlexGridWrapper::SetColumnCount(int count) { AxVSFlexLib::AxVSFlexGrid^ vsflexgrid = (AxVSFlexLib::AxVSFlexGrid^)System::Runtime::InteropServices::Marshal::GetObjectForIUnknown(vsflexgridPtr); vsflexgrid->Cols = count; } void VSFlexGridWrapper::SetCellText(int row, int col, System::String^ text) { AxVSFlexLib::AxVSFlexGrid^ vsflexgrid = (AxVSFlexLib::AxVSFlexGrid^)System::Runtime::InteropServices::Marshal::GetObjectForIUnknown(vsflexgridPtr); vsflexgrid->TextMatrix[row, col] = text; } void VSFlexGridWrapper::SetCellBackColor(int row, int col, System::Drawing::Color color) { AxVSFlexLib::AxVSFlexGrid^ vsflexgrid = (AxVSFlexLib::AxVSFlexGrid^)System::Runtime::InteropServices::Marshal::GetObjectForIUnknown(vsflexgridPtr); vsflexgrid->CellBackColor = color.ToArgb(); vsflexgrid->Redraw = true; } ``` 7. 在项目中添加对AxInterop.VSFlexLib.dll和Interop.VSFlexLib.dll的引用。 8. 在应用程序中使用该类,例如: ``` #include "stdafx.h" #include "VSFlexGridWrapper.h" using namespace VSFlexGridWrapper; int main(array<System::String ^> ^args) { VSFlexGridWrapper^ vsflexgrid = gcnew VSFlexGridWrapper(); vsflexgrid->SetRowCount(5); vsflexgrid->SetColumnCount(3); vsflexgrid->SetCellText(0, 0, "Hello"); vsflexgrid->SetCellText(0, 1, "World"); vsflexgrid->SetCellBackColor(0, 0, System::Drawing::Color::Red); return 0; } ``` 这个例子演示了如何使用C++/CLI封装ActiveX控件VSFlexGrid,并提供了一些常用的方法来设置行数、列数、单元格文本和单元格背景颜色。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值