vs2010 .net 调用c++的简单例子

来源:互联网 发布:小狐仙软件标准版 编辑:程序博客网 时间:2024/06/05 07:34

一 、先介绍两个重要的关键词组

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 修改一下对应的值一般就能解决问题

 

原创粉丝点击