VS2008C++C#混合编程

1. 建立一个C#控制台项目,主要用于调试。
2. 在解决方案中添加一个新的空项目(VC++的)。
3. 添加一个源文件到Source Files文件夹(xxx.c or xxx.cpp)。
4. 加入这行代码
#include <string.h>
extern "C" __declspec(dllexport) int mySum(int a,int b,int *c)

    *c=a+b; 
    return *c;

5. 右键点击C++项目,"属性"->"配置属性"->"常规"->"配置类型"中选择DynamicLibrary (.dll)。这里还要注意的是为了编译生成的dll文件能被c# 项目导入你需要Common Language Runtime support 选择Common Language Runtime Support (/clr)这项,否则编译的dll不能用到c#项目当中。
6. build C++项目(你也可以用命令行CL.exe来编译文件)。之后,有很多人就直接向当然的跑到c++项目下面的Debug文件夹里去找xxx.dll文件,结果只看到xxx.dll.intermediate.manifest这样的文件失望而归。其实编译后真正的dll文件是在解决方案的Debug文件夹下面。
7. 在c#项目的引用中导入xxx.dll。在c#主文件中键入如下代码:我这里的xxx = Cpp
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace CSharp
{
    class Program
    {
        [DllImport("Cpp.dll", EntryPoint = "mySum", CharSet = CharSet.Ansi,CallingConvention = CallingConvention.StdCall)]
        public static extern int mySum(int a, int b, ref int c);
        static void Main(string[] args)
        {
            int c = 0;
            Console.WriteLine(mySum(2, 3, ref c));
            Console.Read();
        }
    }
}

最后你会看到运行结果:5。
DllImport属性
DllImport属性是主要是用在导入非托管代码的函数,比如调用c/c++编写的函数在c#,那么你需要用到DllImport属性,很多的WinApi调用都需要这个属性。
DllImport的属性主要有四个:
EntryPoint : 说明该函数是来自哪个dll文件,也就是这个dll的入口函数在哪个文件上,函数名称。
CharSet:该属性用于控制名字和字符串序列化。.Net framework支持四种模式的CharSet: Auto, Unicode, None, Ansi。不同版本的framework可能默认的CharSet不一样,在Compact版本上是Unicode,而普通版上是Ansi。
CallingConvention:这个属性是指明对dll导出函数采用什么规范,我们知道dll的到处函数有__stdcall, __fastcall, __cdecl, __declspec这几种。那么我们根据对应的dll,通过这个属性来设置。但大多数情况下,wins 下导出的api都是__stdcall规范的,所以framwork设置的默认值是WinApi.这个会在CE和普通版上自动转换。
SetLastError:这个属性用过WinApi的都知道,Wins有一个GetLastWin32Error的API所以这属性跟它对应,如果函数调用失败操作系统会设置一个错误号。在C#语言中默认是false。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮特大熊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值