c++ c#混合编程



c++代码:

#include "stdafx.h"
#include <windows.h>
extern   "C" _declspec(dllexport)  void fun();		//输出函数声明


#ifdef _MANAGED
#pragma managed(push, off)
#endif


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
    return TRUE;
}




void _declspec(dllexport) fun()				//输出函数定义
{
	MessageBoxW(NULL,TEXT("hello!!!"), TEXT("demo"), MB_OK);
}


#ifdef _MANAGED
#pragma managed(pop)
#endif


需要注意的是如何去声明一个dll输出函数,可以查看dll文件可选头里面的目录目数据项的第一项,这个里面记录着输出表的rva,定位到文件,可以找到输出函数的相关信息

这个dll是这样定义的:
声明一个dllexport 函数   格式 extern ''C" _declspec(dllexport) void fun();

定义这样dllexport函数    格式 void  _declspec(dllexport) fun();



C#代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;




namespace invoke_dll_fun
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int[] a1 = new int[] { 1, 2, 3 }; 
        static int i=0; //写在函数button1_Click外边,class里面
        [DllImport("dll.dll")]
        public static extern void fun();
        private void click_Click(object sender, EventArgs e)
        {
            textBox1.Text = a1[i%3].ToString(); 
            i++;
            fun();

        }
    }
}

注意:

        [DllImport("dll.dll")]
        public static extern void fun();
这两行是关键,导入dll文件,然后声明这个外部函数,最后在click方法里面调用fun()方法,以达到c++ c# 混合编程的效果。


遇到问题

1.错误CS0246: 找不到类型或命名空间名称“DllImport”(是否缺少using 指令或程序集引用?)

加上

using  System.Runtime.InteropServices;解决问题

2.如果在dll创建的时候不加上关键字_declspec(dllexport) 这样写出来的函数是不能出现在输出表中的

3.创建dll的时候默认字符集是unicode,这样在传字符串的时候会出现错误,需要修改字符集,设置为空




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值