这段时间有个项目是需要使用vc++的程序访问.Net的类,在网上搜过很多文章,大致有两个方法:
将.Net程序编译成COM,并让C++代码访问COM组件进行调用。
另一个方法使用CRL编译选项,让.Net代码在CRL(公共运行语言)中管理,这样c++就可以方便的引用.Net的对象。
C++是属于非托管类,而.Net是属于托管类。在运行库的控制下执行的代码称作托管代码,相反,在运行库之外运行的代码称作非托管代码。COM 组件、ActiveX 接口和 Win32 API 函数都是非托管代码的示例。而.Net则属于托管类。微软的产品中这些不同的代码之间都是可以交互的,接下来我将结合实例讲解,此篇文章讲述第二种方式,使用CRL。对于COM的方式稍麻烦一点,如果有兴趣可以查看一下MSDN,地址是:
COM Interop Tutorials
与非托管代码交互操作
使用VS 2003编写DLL
首先我们创建一个Visual C++项目,创建“类库(.Net)”模板类型,项目名称为“Library”。
创建完了之后你将会看到项目属性中->常规->使用托管扩展,值为“是”,这个选项勾上以后,将按照/crl编译。在VS项目的资源管理器中,将会引用两个.Net库,System.dll
和System.Data.dll
,但是这样还不够,因为需要有.Net lib支持,比较方便一点的是在引用中增加“mscorlib”库,这样项目编译时将默认加入这个库进行编译。
接下来先编写Library.h,增加一个DLL Function
// Library.h
extern "C"
{
__declspec(dllexport) int __stdcall Sum(int a,int b);
}
然后实现这个头文件,实现的文件名为Library.cpp。
// 这是主 DLL 文件。
#include "stdafx.h"
#include "Library.h"
#pragma comment(lib , "msvcrtd.lib")
using namespace System;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
int __stdcall Sum(int a,int b)
{
Console::WriteLine("It's in method of Sum");
System::Text::StringBuilder *sb = new System::Text::StringBuilder();
sb->Append(a);
sb->Append(" + ");
sb->Append(b);
sb->Append(" = ");
sb->Append(a + b);
Console::WriteLine(sb->ToString());
return a + b;
}
Sum方法使用了两个.Net类,使用.Net的System.Console输出打印的数据,并使用StringBuilder帮助我们增加字符串。VS 2005以上的版本的写法和2003略有不同,2005将这种引用视为特殊的指针类型,那么这个时候的指针不是用‘*’,而是'^',new变成了gcnew
System::Text::StringBuilder ^sb = gcnew System::Text::StringBuilder();
sb->Append(a);
sb->Append(" + ");
sb->Append(b);
sb->Append(" = ");
sb->Append(a + b);
接下来我们就可以编译他了,编译成功之后,可以使用一个Visual C++创建的项目调用它。
关于“Library error LNK2020: 无法解析的标记(0A00001C) _CxxThrowException”的问题
这个异常在/crl编译的选项中经常出现,对此我困惑了很久,因为我在项目中使用到了VC++的一些io类,只要使用了他编译的时候就报这个错误,有时也会不使用io类也会出现这个问题,分析看来是缺少某些文件。经过网上的漫长搜索,终于发现,这个是托管扩展在Debug管理器中出现的一些问题,所以需要手动的加入msvcrtd.lib,msvcrtd.dll是微软编译程序调试版本相关文件。加入以后就没问题了。
关于源代码
本人上传的源代码只供学习参考使用,希望也有和我一样刚接触此技术的朋友能够顺利的夸过这一难关,希望他能给各位节省不少的时间,同时也为我自己总结一下经验。
源代码包含两部分,Library是用VS 2003创建的DLL .Net模板的项目。
InvokeLibrary是用VC++ 2006创建的Console项目,用来调用Library.dll的测试代码。
参考资料
CLR 控制台应用程序模板 (C++) -- MSDN Library
分享到:
相关推荐
VC++动态调用DLL实列 大家一起学习进步 让CSDN更完美!!!!!!!!!!!!!!!!!!!!
超级简单并且没有其他实用功能,仅作备份而已
VC++ 调用 C#生成DLL的多种方法,比较全面。
在.Net中调用VC++DLL的示例,其中包括 字符串处理,指针处理,结构处理,数组处理。
C#调用VC++.net 2005动态链接库 使用IntPtr 包含 BSTR char**
VC++ 调用 C#生成DLL的详细方法
c#开发的插件DLL,用C++来调用 。 折腾了几天终于找到的解决的方法 注意:C++中设置:Common Language Runtime support(/clr)
是我的CSDN博客中文章“VC++调用Matlab编写的DLL(混合编程)”的配套实例。资源中的源程序实现了VC++中在VS2008中进行VC和matlab的混合编程,在vc程序中调用自己编写的matlab绘图DLL。请先仔细阅读我的CSDN博客中...
WinCC调用自定义DLL文件!可运行!采用C++搭建并编译好的框架!大家可以利用该框架写上自己需要的控制模型或算法!完成千奇百怪的控制!
封装了java调用.net的websevice接口,解决了soapaction报错和server not identified错误,使用soap1.1协议。
Java 调用.NET web服务
VB中调用VC++开发的DLL
该压缩包包括:1....3.压缩包中包括VC++调用DLL的实例源码和Delphi调用DLL的实例源码和说明(利用前面VC++生成的DLL)!4.其中VC++调用DLL实例中还简单说明了计算string的长度,比较,大小写转换等功能实现的方法!
自从微软推出16位的Windows操作系统起,此后每种版本的Windows操作系统都非常依赖于动态链接库(DLL)中的函数和数据,实际上 Windows操作系统中几乎所有的内容都由DLL以一种或另外一种形式代表着,例如显示的字体和...
vb.net 调用DLL 描述如何用vb调用DLL
1. Gen DLL 使用C# 2015 生产DLL 库文件。2. 使用Labview 的.NET 功能,调用Gen DLL生成的库文件,得到结果。3. 可以作为Labview 学习者调用.NET的方法参考。网上这方面资料较少,供需要的人参考。
android 调用.net webservice
lablview 网页抓取天气预报。利用前面板的.net容器,插入.net控件(WebBrowser),调用Navigate2方法,输入URL,然后从其属性Dcument获得数据。。。。
C#编写COM组件,VC++调用,Int,String,BYTE[]参数传值和返回