编译生成C++导出函数dll,并在C#工程中测试

编译生成过程:

1.建立dll工程

选择新建visual C++的

这两个类型工程,都会出现下面界面,在这里设置生成dll:

2.设置项目:

项目属性中设置:

3.相关代码:

由于项目的名称是"TestCPPDLL",因此,会自动生成TestCPPDLL.h和TestCPPDLL.cpp两个文件,.h文件是要导出内容的声明文件,为了能清楚的说明问题,我们将TestCPPDLL.h和TestCPPDLL.cpp两个文件中的所有内容都删除,然后在TestCPPDLL.h中添加如下内容:

头文件:

#define TESTCPPDLL_API __declspec(dllexport)
EXTERN_C TESTCPPDLL_API int __stdcall Add(int a, int b);

源文件:

TESTCPPDLL_API int __stdcall Add(int a, int b)
{
    return a + b;
}

测试过程如下:

新建一个C#空工程项目,修改生成的main文件:

1.添加

using System.Runtime.InteropServices;

2.在静态方法中添加:

[DllImport(@"G:/VS13_Project/TestCPPDLL/Release/TestCPPDLL.dll", EntryPoint = "Add")]
extern static int Add(int a, int b);

具体如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Runtime.InteropServices; //加上这行

namespace testC
{
    class Program
    {
        [DllImport(@"G:/VS13_Project/TestCPPDLL/Release/TestCPPDLL.dll", EntryPoint = "Add")]
        extern static int Add(int a, int b);
        static void Main(string[] args)
        {
            int c = Add(1, 2);
            Console.Write(c);
            Console.Read();
        }
    }
}

参考:http://jingyan.baidu.com/article/67508eb43f91869cca1ce49c.html

时间: 2024-11-03 05:41:59

编译生成C++导出函数dll,并在C#工程中测试的相关文章

C++ DLL导出函数的两种方法(导出序号那种方法,别人看不到函数名)

第一种就直接导出函数名如下代码: #ifdef__cplusplus #define TEXPORT extern "c" _declspec(dllexport) #dlse #define TEXPORT _declspec(dllexport) TEXPORT BOOL FUN();//这就是要导出函数 这种方法查看DLL时能看到函数名. 第二种是就导出序号如下代码: bool _stdcall fun(); 在工程右键添加新项目点模块定义文件.DEF, 在在DEF文件里写 LI

编写DLL所学所思(1)——导出函数

烛秋  http://www.cnblogs.com/cswuyg/archive/2011/09/30/dll.html 动态链接库的使用有两种方式,一种是显式调用.一种是隐式调用. (1)       显式调用:使用LoadLibrary载入动态链接库.使用GetProcAddress获取某函数地址. (2)       隐式调用:可以使用#pragma comment(lib, “XX.lib”)的方式,也可以直接将XX.lib加入到工程中. DLL的编写 编写dll时,有个重要的问题需要

如何隐藏DLL中,导出函数的名称?

一.引言 很多时候,我们写了一个Dll,不希望别人通过DLL查看工具,看到我们的导出函数名称.可以通过以下步骤实现: 1. 在def函数中做如下定义: LIBRARY EXPORTS HideFuncName @1 NONAME 通过添加NONAME关键字,隐藏函数名,这样的话,用Dependency Walker来查看该Dll,只能看到如下结果: 2. 如何调用该Dll中的函数,通过ID的方式调用,代码如下: 1 typedef void (WINAPI *FPHideFuncName)();

使用Visual Studio自带工具dumpbin查看动态链接库(.dll)导出函数

当我们需要查看一个dll或exe文件中的包含的函数或是依赖的函数之类的信息,可以使用Visual Studio自带的工具dumpbin来实现,使用方法为: 1/ 启动Visual Studio 命令行工具: 2/ 查看导出函数,执行 dumpbin /exports (dll或者exe文件路径) 3/ 查看依赖性,执行 dumpbin /dependents (dll或者exe文件路径) 4/ 可以使用 /out:(文件名)参数将打印信息输出到文本文件中.

C#调用C++ dll导出函数提示找不到指定模块

在X64系统上,用VS2013编写了一个C++动态链接库,里面提供了一个导出函数SGFYS. 编译为DLL之后,我们用C#对其动态链接库进行调用,调用代码如下: 此时会被提示,试图加载不正确的格式.我们对该.NET项目属性进行配置,右键该项目--属性--生成--目标平台修改为(x86) 之后再次调用,已经可以被正确调用. 此时我们将该程序放到XP下运行,会报错“找不到指定模块”. 我们用 Dependency walker加载该DLL,发现缺少依赖MSVCR120D.DLL 导致上述问题的原因是

DLL中__declspec(dllexport)和.def(模块定义文件)定义导出函数的一点区别

原想是不在DLL中使用.def文件的,直接在需要导出的函数前加__declspec(dllexport)修饰.但在是要导出STDAPI __declspec(dllexport) DllGetClassObject的时候,就提示"warning C4518: “__declspec(dllexport ) ” : 此处遇到意外的存储类或类型说明符:被忽略"(我用的是vc.net 2003). STDAPI这个宏扩展出来是extern "C" HRESULT __st

C++ DLL中导出函数的声明的方法

定义: TESTDLLEXPORT_API int fnTestDllExport(void); TESTDLLEXPORT_API int fnTestCall(void); TESTDLLEXPORT_API int fnAddInt(int i,int j); TESTDLLEXPORT_API BOOL fnContact(char* a); 建立一个.def文件 LIBRARY TestDllExportEXPORTS fnContact @1fnAddInt @2fnTestDllE

准确看看 user32.dll 里有哪些导出函数(win7-32)

看看 user32.dll里有哪些导出函数,大家都会,但准确性???以MS dumpbin为标准,要做出来结果一模一样,才表示代码完全正确. 直接上代码: 1 // ListExport.cpp : Defines the entry point for the console application. 2 // 3 #include "stdafx.h" 4 #include <windows.h> 5 #include <winnt.h> 6 7 exter

如何隐藏DLL中,导出函数的名称?(转)

如何隐藏DLL中,导出函数的名称?(转) 一.引言 很多时候,我们写了一个Dll,不希望别人通过DLL查看工具,看到我们的导出函数名称.可以通过以下步骤实现: 1. 在def函数中做如下定义: LIBRARY EXPORTS HideFuncName @1 NONAME 通过添加NONAME关键字,隐藏函数名,这样的话,用Dependency Walker来查看该Dll,只能看到如下结果: 2. 如何调用该Dll中的函数,通过ID的方式调用,代码如下: 1 typedef void (WINAP