vc能不能调用vb.net写的dll解决方法
vc能不能调用vb.net写的dll
vc能不能调用vb.net写的dll,我用的开发环境是vs2005,求大神详细教程
------解决方案--------------------
解开VC++调用.Net DLL的神秘面纱 VC++.net项目管理CC++ .
这段时间有个项目是需要使用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
Cpp代码
1.// Library.h
2.
3.extern "C"
4.{
5. __declspec(dllexport) int __stdcall Sum(int a,int b);
6.}
// Library.h
extern "C"
{
__declspec(dllexport) int __stdcall Sum(int a,int b);
}
然后实现这个头文件,实现的文件名为Library.cpp。
Cpp代码
1.// 这是主 DLL 文件。
2.
3.#include "stdafx.h"
4.
5.#include "Library.h"
6.
7.#pragma comment(lib , "msvcrtd.lib")
8.
9.using namespace System;
10.
11.BOOL APIENTRY DllMain( HANDLE hModule,
12. DWORD ul_reason_for_call,
13. LPVOID lpReserved
14. )
15.{
16. return TRUE;
17.}
18.
19.int __stdcall Sum(int a,int b)
20.{
21. Console::WriteLine("It's in method of Sum");
22. System::Text::StringBuilder *sb = new System::Text::StringBuilder();
23. sb->Append(a);
24. sb->Append(" + ");
25. sb->Append(b);
26. sb->Append(" = ");
27. sb->Append(a + b);
28. Console::WriteLine(sb->ToString());
29. return a + b;
vc能不能调用vb.net写的dll,我用的开发环境是vs2005,求大神详细教程
VC
VB.NET
Visual Studio 2005
------解决方案--------------------
解开VC++调用.Net DLL的神秘面纱 VC++.net项目管理CC++ .
这段时间有个项目是需要使用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
Cpp代码
1.// Library.h
2.
3.extern "C"
4.{
5. __declspec(dllexport) int __stdcall Sum(int a,int b);
6.}
// Library.h
extern "C"
{
__declspec(dllexport) int __stdcall Sum(int a,int b);
}
然后实现这个头文件,实现的文件名为Library.cpp。
Cpp代码
1.// 这是主 DLL 文件。
2.
3.#include "stdafx.h"
4.
5.#include "Library.h"
6.
7.#pragma comment(lib , "msvcrtd.lib")
8.
9.using namespace System;
10.
11.BOOL APIENTRY DllMain( HANDLE hModule,
12. DWORD ul_reason_for_call,
13. LPVOID lpReserved
14. )
15.{
16. return TRUE;
17.}
18.
19.int __stdcall Sum(int a,int b)
20.{
21. Console::WriteLine("It's in method of Sum");
22. System::Text::StringBuilder *sb = new System::Text::StringBuilder();
23. sb->Append(a);
24. sb->Append(" + ");
25. sb->Append(b);
26. sb->Append(" = ");
27. sb->Append(a + b);
28. Console::WriteLine(sb->ToString());
29. return a + b;