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

本文介绍了如何在C++类库与C#项目间实现跨语言调用,包括代码示例及解决运行时错误的策略。通过使用PInvoke技术,展示了如何在不同语言环境中共享接口,并提供了调试与解决调用不匹配问题的指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值