vs2010 .net 调用c++的简单例子
2012-10-17 10:50
435 查看
一 、先介绍两个重要的关键词组
1.extern "C" __declspec(dllexport) 放在C++的方法前是作用是向外提供接口
2.static extern 放在C#的代码前作用是寻找外部对应的方法
二、现在开是进行项目的编写
1.打开vs2010 新建C++类库取名为MyTest
2.在源文件文件夹下有一个MyTest.cpp打开MyTest.cpp
添加代码
extern "C" __declspec(dllexport) char* GetString(){
return "holle world";
}
然后编译生成
3.新建C#控制台项目在控制台项目中引用c++项目生成的.dll文件
4.写C#代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Program
{
//"MyTest.dll" 是对应的dll的名称
// EntryPoint = "GetString" dll 对应的方法名
// CharSet = CharSet.Ansi 数据传递的类型
// CallingConvention 约定
[DllImport("MyTest.dll", EntryPoint = "GetString", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
extern static string GetString();
static void Main(string[] args)
{
Console.WriteLine(GetString());
Console.Read();
}
}
}
然后运行C#项目就可以了
-----------------------------------------------------------------------------------------------
在运行时如果出现
对 PInvoke 函数“ConsoleApplication1!ConsoleApplication1.Program::mySum”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。等问题的话就看C# 和c++的数据类型是否对应, CharSet 和CallingConvention 修改一下对应的值一般就能解决问题
1.extern "C" __declspec(dllexport) 放在C++的方法前是作用是向外提供接口
2.static extern 放在C#的代码前作用是寻找外部对应的方法
二、现在开是进行项目的编写
1.打开vs2010 新建C++类库取名为MyTest
2.在源文件文件夹下有一个MyTest.cpp打开MyTest.cpp
添加代码
extern "C" __declspec(dllexport) char* GetString(){
return "holle world";
}
然后编译生成
3.新建C#控制台项目在控制台项目中引用c++项目生成的.dll文件
4.写C#代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Program
{
//"MyTest.dll" 是对应的dll的名称
// EntryPoint = "GetString" dll 对应的方法名
// CharSet = CharSet.Ansi 数据传递的类型
// CallingConvention 约定
[DllImport("MyTest.dll", EntryPoint = "GetString", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
extern static string GetString();
static void Main(string[] args)
{
Console.WriteLine(GetString());
Console.Read();
}
}
}
然后运行C#项目就可以了
-----------------------------------------------------------------------------------------------
在运行时如果出现
对 PInvoke 函数“ConsoleApplication1!ConsoleApplication1.Program::mySum”的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。等问题的话就看C# 和c++的数据类型是否对应, CharSet 和CallingConvention 修改一下对应的值一般就能解决问题
相关文章推荐
- 简单C++调用lua函数及C++和lua相互函数调用小例子
- nodejs调用c++ addon的简单例子(带参数)
- C++ 调用Lua简单例子
- C++ 调用Lua简单例子
- java中调用C/C++编写的生成的动态连接库dll文件接口的简单例子
- LUA与C++互相调用简单例子
- 简单C++调用lua函数及C++和lua相互函数调用小例子
- C++ 调用Lua简单例子
- 简单C++调用lua函数及C++和lua相互函数调用小例子
- 在eclipse下,JAVA通过JNI调用C++方法的简单例子(非android)
- lua环境的配置以及c++调用lua的简单例子
- 简单C++调用lua函数及C++和lua相互函数调用小例子
- C++ 调用Lua简单例子
- 简单C++调用lua函数的小例子
- C++调用Lua读取配置文件的一个简单例子
- C++调用lua简单的例子
- VS2010 c++生成和调用dll例子
- C++ 编写、 调用 dll 简单例子
- SEXTANTE中调用任意C++控制台程序的简单例子
- windows下C++调用shell启动和关闭可执行文件exe的最简单方法