这段时间有个项目是需要使用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
分享到:
相关推荐
本示例主要探讨如何在.NET(以C#为例)中调用VC++编写的DLL,涉及的关键技术包括字符串处理、指针操作、结构传递以及数组操作。下面将详细解释这些知识点。 1. **字符串处理**: 在.NET中,字符串通常是Unicode的`...
标题 "PB调用.NET COM组件" 涉及的关键知识点主要集中在PowerBuilder(PB)如何与.NET Framework中的COM组件交互。在.NET Framework中,可以通过创建COM互操作组件(也称为托管COM),使得非.NET环境如PB这样的应用...
1. **使用P/Invoke**:这是C++直接调用.NET DLL的常见方法。P/Invoke允许C++代码通过使用托管代码的元数据信息直接调用.NET函数。在C++中,我们需要使用`#pragma comment(lib, "YourDllName.lib")`指令引入库,并...
**VC++.NET教程详解** **一、VC++.NET概述** VC++.NET是Microsoft公司推出的用于开发Windows应用程序的集成开发环境(IDE),它是Visual Studio.NET的一部分,主要基于C++语言,并结合了.NET Framework的强大功能...
4. **Windows API**: VC++.NET可以调用Windows API进行系统级别的编程,实现底层功能,如文件操作、窗口管理、图形绘制等。 5. **MFC (Microsoft Foundation Classes)**: MFC是微软提供的C++类库,封装了Windows ...
本篇将详细讲解如何在C#中调用VC++.net 2005编译的动态链接库,并涉及关键概念如`IntPtr`,`BSTR`以及`char**`。 首先,`DllImport`特性是C#中用来导入外部DLL的关键工具。在C#代码中,你需要创建一个包含这些特性...
《VC++.NET实例》源代码是一份非常宝贵的资源,它为学习C++和Microsoft的Visual C++.NET(也称为.NET Framework的一部分)的开发者提供了实践性的示例和项目。这个压缩包包含了多个文件,每个文件都是一个具体的编程...
是我的CSDN博客中文章“VC++调用Matlab编写的DLL(混合编程)”的配套实例。资源中的源程序实现了VC++中在VS2008中进行VC和matlab的混合编程,在vc程序中调用自己编写的matlab绘图DLL。请先仔细阅读我的CSDN博客中...
标题提到的“用java调用.net接口的方法”就是解决这个问题的一种技术实践。以下将详细讲解三种主要的实现方式,以及如何通过提供的源代码进行操作。 首先,我们要理解Java和.NET之间的互操作性通常依赖于Web服务...
总的来说,理解并掌握如何在VC++中创建和调用DLL是一项重要的技能,它不仅有助于优化资源利用,也有利于软件开发的高效进行。通过实践和学习,开发者能够更好地利用DLL这一强大的工具来提升Windows应用程序的性能和...
.NET DLL文件是微软.NET框架下的动态链接库,它包含了可重用的代码模块,供其他应用程序调用。在开发过程中,有时我们可能需要查看或理解一个DLL中的具体实现,这时就需要借助于反编译工具。本文将深入探讨.NET DLL...
在VC++开发中,有时我们需要调用动态链接库(DLL)中的资源,比如图片、字符串、对话框模板等。这通常涉及到DLL的编程技术以及如何在主程序中访问这些资源。下面将详细介绍如何在VC++中调用DLL中的资源。 首先,让...
本文将详细讲解如何使用Java调用.NET发布的Web Service(ASMX),并解决在此过程中可能出现的SOAPAction报错和“Server not identified”错误。 首先,我们需要了解ASMX。ASMX是.NET Framework早期版本中用于创建...
【VC++ 和 C# 互相调用 DLL 的全部可行方法】 在软件开发中,有时候我们需要在VC++项目中调用C#编写的DLL,或者反之。以下是一些常见的、全面的解决方案: 1. **COM互操作** - **优点**:通过将C#类注册为COM组件...
这种方式适用于调用.NET平台的DLL,例如上文部分提供的示例,通过反射加载DLL并实例化类,然后调用其公开的方法。 ```vbnet Public Class TestClass Public Function Add(ByVal add1 As Integer, ByVal add2 As ...
Java程序调用.NET/C#的Web服务是一种跨平台的交互方式,主要依赖于SOAP(Simple Object Access Protocol)协议,使得不同编程语言开发的应用程序能够相互通信。在本场景中,用户已经提供了一个.NET的Web服务,而我们...
C#程序通过.NET Framework的平台调用服务(Platform Invoke, P/Invoke)来与非托管代码(如VC++的DLL)交互。P/Invoke允许C#代码使用C风格的函数调用约定,这使得可以调用C++导出的函数。你需要在C#中定义一个与DLL...
`mscoree.dll`作为.NET Framework的一部分,被许多.NET应用程序调用,以实现对.NET Framework的依赖功能。 【压缩包中的其他文件】 - `凤凰网站----下载.htm`可能是一个网页文件,提供了下载.NET Framework或者相关...
在本教程中,我们将深入探讨如何在VC++.net 2003环境下使用分隔条进行水平或垂直布局的设置。这将涉及到Windows API、MFC库以及具体的编程技巧。 首先,分隔条控件在MFC中由CSplitterWnd类代表。这个类提供了一个...