在C++ 中 如何调用 C# 写的DLL
2015-10-10 09:31
387 查看
对于很多和我一样的老C++程序员来讲,如果不能与时俱进,不但会倍感失落,还会真的自绝于天下。
比如C#有很多好的组件, 如NPOI ,如。。。,怎么在C++中也自如调用呢,这样不用去学习C#,不用换刀,也可以达到同样的目的。
网上看了半天,找到的资料要么太老,要么不对,干脆自己调试一遍。下面把体会说一说。
调试环境:visual studio 2010 .
时间:2012.12.20
一、C#写的类库:
using System;
using System.Collections.Generic;
using System.Text;
namespace ClassLibrary1
{
public classClass1
{
public String Name
{
get;
set;
}
public void helloWorld()
{
Console.WriteLine("hello world!");
}
}
}
// C#程序配置,一定是类库
二、C++ 程序
共有三个程序文件
(1) 主程序
// test1.cpp : 定义控制台应用程序的入口点。
//
///
//
// 在C++ 项目属性 [配置]-[常规]中,公共语言运行时支持,一定要选择“公共语言运行时支持”
//
#include "stdafx.h"
#include "yotopcompany.h"
#using"..\ClassLibrary1\bin\Debug\ClassLibrary1.dll" //引用C#类库
using namespaceClassLibrary1; //声明命名空间,非必须
int _tmain(int argc, _TCHAR* argv[])
{
printf("hello world");
ClassLibrary1::Class1 ^c = gcnewClassLibrary1::Class1(); //注意一定要用 ^ , 一定要用gcnew
c->Name = "\nxignxianghong";
printf("%s\n", c->Name);
c->helloWorld();
YotopCompany^a = gcnew YotopCompany("a","b","c");
printf("%s,%s,%s",a->name,a->address,a->phoneNumber);
getchar();
return0;
}
(2) c++ 中自己编写的一个类
// yotopCompany.h
#pragma once
ref class YotopCompany
{
public:
YotopCompany(void);
YotopCompany(char* name,char* address,char* phoneNumber);
char* name;
char*address;
char* phoneNumber;
};
(3) c++编写的类的CPP文件
//yotopcompany.cpp
#include "StdAfx.h"
#include "YotopCompany.h"
YotopCompany::YotopCompany(void)
{
name ="yotop";
phoneNumber= "12345678" ;
address ="北京";
}
YotopCompany::YotopCompany(char*_name ,char* _address,char*_phoneNumber)
{
name =_name;
address =_address;
phoneNumber= _phoneNumber ;
}
(4) c++ 程序配置
三、如果还有疑问,请参考 MSDN 文章:
// How to call a managed DLL from native Visual C++ code in VisualStudio.NET or in Visual Studio 2005
// 如何在 Visual Studio.NET 或 Visual Studio 2005 中的本机 Visual C++代码中调用托管的 DLL
// http://support.microsoft.com/kb/828736
四、总结:
1)用C#写任何的类库
2)C++ 中要引用此类库
3)创建C#对象时要用gcnew ;
4) C++ 编译设置一定设置为:支持公共语言运行时支持(/clr)
4) 自身的C++类要用 ref class 定义。
希望关心上述主题的朋友能够如愿以偿,GOOD LUCK!
比如C#有很多好的组件, 如NPOI ,如。。。,怎么在C++中也自如调用呢,这样不用去学习C#,不用换刀,也可以达到同样的目的。
网上看了半天,找到的资料要么太老,要么不对,干脆自己调试一遍。下面把体会说一说。
调试环境:visual studio 2010 .
时间:2012.12.20
一、C#写的类库:
using System;
using System.Collections.Generic;
using System.Text;
namespace ClassLibrary1
{
public classClass1
{
public String Name
{
get;
set;
}
public void helloWorld()
{
Console.WriteLine("hello world!");
}
}
}
// C#程序配置,一定是类库
二、C++ 程序
共有三个程序文件
(1) 主程序
// test1.cpp : 定义控制台应用程序的入口点。
//
///
//
// 在C++ 项目属性 [配置]-[常规]中,公共语言运行时支持,一定要选择“公共语言运行时支持”
//
#include "stdafx.h"
#include "yotopcompany.h"
#using"..\ClassLibrary1\bin\Debug\ClassLibrary1.dll" //引用C#类库
using namespaceClassLibrary1; //声明命名空间,非必须
int _tmain(int argc, _TCHAR* argv[])
{
printf("hello world");
ClassLibrary1::Class1 ^c = gcnewClassLibrary1::Class1(); //注意一定要用 ^ , 一定要用gcnew
c->Name = "\nxignxianghong";
printf("%s\n", c->Name);
c->helloWorld();
YotopCompany^a = gcnew YotopCompany("a","b","c");
printf("%s,%s,%s",a->name,a->address,a->phoneNumber);
getchar();
return0;
}
(2) c++ 中自己编写的一个类
// yotopCompany.h
#pragma once
ref class YotopCompany
{
public:
YotopCompany(void);
YotopCompany(char* name,char* address,char* phoneNumber);
char* name;
char*address;
char* phoneNumber;
};
(3) c++编写的类的CPP文件
//yotopcompany.cpp
#include "StdAfx.h"
#include "YotopCompany.h"
YotopCompany::YotopCompany(void)
{
name ="yotop";
phoneNumber= "12345678" ;
address ="北京";
}
YotopCompany::YotopCompany(char*_name ,char* _address,char*_phoneNumber)
{
name =_name;
address =_address;
phoneNumber= _phoneNumber ;
}
(4) c++ 程序配置
三、如果还有疑问,请参考 MSDN 文章:
// How to call a managed DLL from native Visual C++ code in VisualStudio.NET or in Visual Studio 2005
// 如何在 Visual Studio.NET 或 Visual Studio 2005 中的本机 Visual C++代码中调用托管的 DLL
// http://support.microsoft.com/kb/828736
四、总结:
1)用C#写任何的类库
2)C++ 中要引用此类库
3)创建C#对象时要用gcnew ;
4) C++ 编译设置一定设置为:支持公共语言运行时支持(/clr)
4) 自身的C++类要用 ref class 定义。
希望关心上述主题的朋友能够如愿以偿,GOOD LUCK!
相关文章推荐
- c语言的scanf函数
- Java和C/C++进行DES/AES密文传输
- C++没有所谓的"赋值构造函数"
- C++中用字符串来切割字符串
- C++中如何split字符串
- 使用c++实现时间轮算法(Timing-Wh…
- C++的Stack实现
- C++中用模板模拟多态及其优缺点
- c++中异常的时间代价
- 简化C++内存管理,避免内存泄露的…
- 史上最简单的c++四种cast使用教程
- c++中实现类似java printStackTrac…
- 代码复用之道:回调机制及c++实现…
- 跨平台c++编程差异小结
- 【LeetCode从零单刷】Majority Element
- 进击的KFC:第二节:C语言:关系运算符、逻辑运算符、if 、条件运算符、switch..case的学习
- 【LeetCode从零单刷】Move Zeroes
- C++中的explicit关键字
- CPP-Inheritance
- C++工作的心得体会