C#与C++ DLL的互操作

C#调用C++ DLL要点:

1.C++自己编写的函数必须为导出函数.
2.为把C++函数编译为导出函数,在函数前面加上 

extern "C" __declspec(dllexport)

extern "C":按C语言的进行编译
__declspec(dllexport):表示导出函数,另外导入函数为__declspec(dllimport)

 

 

 
 

C++项目属性:

无公共语言运行时支持

C/C++ => 高级:

1.编译为 => 编译为 C++ 代码 (/TP)

2.调用约定=>__stdcall (/Gz)    注意:调用约定必须是 stdcall、cdecl 或 thiscall 之一。

 

C++函数:

#include "stdafx.h"
#include "stdio.h"
extern "C" __declspec(dllexport) void PrintMsg(const char* msg)
{
    printf("我在C++里编写:PrintMsg.\n下面的字符串是C#传入的:%s\n", msg);
    return;
}

 

C#调用:

        static void Main(string[] args)
        {
            PrintMsg(@"C#夜未眠");

            Console.ReadKey();
        }

        #region 自定义DLL互操作:

        [DllImport(@"E:\code\ConsoleApplication3\Debug\ConsoleApplication3.dll",
            CallingConvention = CallingConvention.StdCall)]
        static extern void PrintMsg(string msg);

        #endregion

 

运行结果:

 

 

另外附加一个:

SayStdC();//这个函数在vs里点启动显示不出来,要进入exe文件目录点击exe执行才能看到

 

        //直接对标准微软C运行库中的函数进行平台调用
        [DllImport("user32.dll", EntryPoint = "MessageBox")]
        public static extern int MessageBox(int hwnd, string lpText, string lpCaption, int wType);

        [DllImport("msvcrt.dll",CallingConvention = CallingConvention.Cdecl)]
        static extern int puts(string msg);//puts函数将字符串传送到输入流中

        [DllImport("msvcrt.dll",CallingConvention = CallingConvention.Cdecl)]
        static extern int _flushall();//手动清除所有输入流

        public static void SayStdC()
        {
            puts("puts函数调用");
            _flushall();
        }

        public static void SayWinAPI()
        {
            MessageBox(0, "Hello C# Code!", "CSharp互操作", 0);
        }

 

运行效果:

 

转载于:https://www.cnblogs.com/wangxingzhou/p/8426969.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值