C#如何调用C写的Win32 DLL

简介: 1. 首先,在Visual Studio中,我们建立一个Visual C++的项目    类型选择Win32 Project,继续选择Dll类型    该项目取名叫做myDll    1) 添加myDll.h头文件,代码如下:#ifdef A_EXPORTS#define DLL_API __declspec(dllexport)#else#define DLL_API __declspec(dllimport)#endifextern "C" DLL_API void HelloWorld();    这里HelloWorld()就是等下我们要暴露给C#调用的C方法。

1. 首先,在Visual Studio中,我们建立一个Visual C++的项目

    类型选择Win32 Project,继续选择Dll类型

    该项目取名叫做myDll

    1) 添加myDll.h头文件,代码如下:

#ifdef A_EXPORTS
#define  DLL_API __declspec(dllexport)
#else
#define  DLL_API __declspec(dllimport)
#endif

extern   " C "  DLL_API  void  HelloWorld();

    这里HelloWorld()就是等下我们要暴露给C#调用的C方法。

    注意:必须给函数增加extern "C"关键字,否则等下将无法找到该

             函数的入口点。

  

    2)添加myDll.cpp文件,代码如下:

#include  " stdafx.h "
#include 
" myDll.h "

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

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    
switch  (ul_reason_for_call)
    {
        
case  DLL_PROCESS_ATTACH:
        
case  DLL_THREAD_ATTACH:
        
case  DLL_THREAD_DETACH:
        
case  DLL_PROCESS_DETACH:
        
break ;
    }

    
return  TRUE;
}

void  HelloWorld()
{
    MessageBox(NULL, TEXT(
" Hello World " ), TEXT( " In a DLL " ), MB_OK);
}

#ifdef _MANAGED
#pragma  managed(pop)
#endif

 

 

 2. 编译成功!接下来我们便可以添加一个C#控制台项目了

     C#测试代码如下:

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Runtime.InteropServices;

namespace  TestDll
{
    
class  Program
    {
        [DllImport(
" myDll.dll " )]
        
public   extern   static   void  HelloWorld();

        
static   void  Main( string [] args)
        {
            HelloWorld();
        }
    }
}

 

  在这里我要特别指出的是两点:

1) 必须使用如下命名空间

using System.Runtime.InteropServices

 

2) 对于原Dll文件中C方法的wrapper

        [DllImport( " myDll.dll " )]
        
public  extern  static  void  HelloWorld();

 

运行程序,会看到弹出Hello World对话框!

 

目录
相关文章
|
5月前
|
C#
C# 解决引用dll,出现dll不可以使用等问题
C# 解决引用dll,出现dll不可以使用等问题
|
18天前
|
C#
Delphi可不可以制作出像c#那样的dll类库?
在Delphi中,创建DLL项目(如dll.dpr)并定义一个类TMyCls后,在另一个项目(如test.dpr)中可以引入此DLL并直接实例化和调用类的方法。然而,Delphi目前主要支持两种DLL形式:动态链接库(需显式声明exports,仅支持函数调用)和ActiveX DLL(需定义IDL接口)。这两种方式都较为繁琐。相比之下,C# 的DLL类库更为便捷,编写并编译后即可在其他项目中直接使用。
|
2月前
|
C#
C# WPF 将第三方DLL嵌入 exe
C# WPF 将第三方DLL嵌入 exe
52 0
|
2月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
4月前
|
安全 编译器 API
程序与技术分享:C#调用DLL的几种方法
程序与技术分享:C#调用DLL的几种方法
71 0
|
5月前
|
XML 缓存 算法
C#非强签名dll搜索顺序
C#非强签名dll搜索顺序
|
开发框架 .NET Java
C#下反射动态加载dll后如何卸载?
C#下反射动态加载dll后如何卸载?
|
网络协议 C# C++
关于 C#调用一个C/C++dll库运行时实现多个应用(静态变量区分) 的解决方法
关于 C#调用一个C/C++dll库运行时实现多个应用(静态变量区分) 的解决方法
关于 C#调用一个C/C++dll库运行时实现多个应用(静态变量区分) 的解决方法
C#编译时嵌入dll至生成的exe
C#编译时嵌入dll至生成的exe
308 0
|
Rust 测试技术 API
【Rust 实战】Rust与C#交互-生成DLL库
【Rust 实战】Rust与C#交互-生成DLL库
1156 0
【Rust 实战】Rust与C#交互-生成DLL库