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)
#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对话框!

 

时间: 2024-11-02 06:31:09

C#如何调用C写的Win32 DLL的相关文章

c#调用c++写成的dll文件

首先是c++写的声明文件 // Inclusion guard #ifndef _DLLTUT_DLL_H_ #define _DLLTUT_DLL_H_ // Make our life easier, if DLL_EXPORT is defined in a file then DECLDIR will do an export // If it is not defined DECLDIR will do an import #if defined DLL_EXPORT #define

创建Win32 DLL,并在C#里面调用

创建 这是三篇网上收集的技术文章的合集,分别讲解了如何创建Win32 DLL,然后如何在C#里面调用这个DLL的教程. 首先是创建Win32 DLL的文章.讲解这个的文章到处都有,这里给出一篇我看过的:http://www.flipcode.com/articles/article_creatingdlls.shtml.Win32 DLL的创建其实在Visual Studio里面已经给出了比较好的模板,只是需要注意的,有些XXX_API宏并没有把extern "C"加进去,这样会造成在

怎样在C#中调用Delphi6写的DLL

我在编写一个系统时遇到了一个问题,无法在C#中调用Delphi6写的DLL,只因为DLL的参数是string类型的.然后在网上找相关的资料,还是没有结果.经过我的再三琢磨,现在已经解决,特写此文章与大家分享我的喜愉!Dellphi DLL文件:///////////////////////////////////////////////////////////////////library mydll; uses SysUtils, Classes; {$R *.res}function Out

php-PHP调用C#写的dll组件,提示Failed to create COM object

问题描述 PHP调用C#写的dll组件,提示Failed to create COM object PHP调用C#写的dll组件,已注册已加载,但是在PHP上仍然是提示Failed to create COM object `CodeData.GetData' 求解啊,谢谢了. C#dll生成,设置修改了以下步骤: 1.在生成(Build)属性里选中"为 COM interop 注册" 2.在签名(signing)属性选中"为程序集签名": 3.新建一个签名,起个名

关于asp.net调用pb写的dll问题

问题描述 关于asp.net调用pb写的dll问题 现在asp.net调用pb写的dll我将dll放到bin目录然后添加引用,初始化的时候查看有哪些接口的时候报错出现死循环这里出现函数求值超时,谁遇到过这种情况求大神们指导. 解决方案 Asp.NET调用C++写的dllAsp.NET调用C++写的dllasp.net调用C++的dll 解决方案二: com对象本身是否有问题,先用activex control test container测试. 解决方案三: 如果winform可以调用的话,估计

封装dll-QT调用C#写的DLL问题,请大家指教一下

问题描述 QT调用C#写的DLL问题,请大家指教一下 我这里有个DLL文件,是用C#写的,托管式的,在QT 中应该怎么调用它?在网上找了很久还是不是很清楚 解决方案 C#写的dll可以包装成activex com dll,然后可以通过别的语言调用.还有一个更简单的办法,就是C#这里做成web service,通过进程外网络调用的方式用qt调用.

c#调用pb写的dll无法正常调用

问题描述 c#调用pb写的dll无法正常调用 现在c#调用pb写的dll,我用winform可以正常调用而用webform调用显示找不到函数的入口,请问大神们怎么解决这个问题 解决方案 两者加载dl 的路径,以及依赖项有区别吧. webform在浏览器上,路径等不是本地路径.还有权限控制等也要考虑

C#调用c写的dll 出现:尝试读取或写入受保护的内存。这通常指示其他内存已损坏

问题描述 求助各位大神!我最近在用C#封装一个C写的dll,在调dll中的方法时,时不时会报"尝试读取或写入受保护的内存.这通常指示其他内存已损坏".出现这样的问题,重启下机器就会好了,不过这也不是解决方案,继续大神帮我看看,如何才能杜绝这个问题.char*__readPeopleInfo_json()这个是C写的dll中的方法定义下面是C#引用及调用的代码[DllImport("HealthyCarder.dll")]publicstaticexternIntPt

c#调用c++写的dll报错,尝试写入受保护的内存。。。求解答

问题描述 c#调用c++写的dll报错,尝试写入受保护的内存...求解答 private void button1_Click(object sender, EventArgs e) { IntPtr key = Marshal.AllocHGlobal(1024); //Marshal.ReleaseComObject(GenerateKeyEx); uint len = 4; string seed = "abcd"; uint slen = (uint)seed.Length;