C# DllImport MFC 扩展 DLL 和名称修改

标签 c# c++ dll mfc dllimport

我有一个 MFC 扩展 DLL,我想在 C# 应用程序中使用它。我公开的函数是 C 函数,即我正在像这样导出它们

extern "C"
{
 __declspec(dllexport) bool Initialize();
}

函数内部使用 MFC 类,那么我需要做什么才能使用 P/Invoke 在 C# 中使用 DLL。

其次,我想使用函数重载,但据我所知,C 不支持函数重载,如果我导出 C++ 函数,它们将被破坏。那么我该怎么做才能解决这个问题呢?我们可以使用 DllImport 导入 C++ 损坏的函数吗?

最佳答案

在标题中有这个声明:

__declspec(dllexport) int fnunmanaged(void);
__declspec(dllexport) int fnunmanaged(int);

你可以使用 dumpbin.exe获取函数的确切名称:

dumpbin.exe /exports unmanaged.dll

Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file unmanaged.dll

File Type: DLL

  Section contains the following exports for unmanaged.dll

    00000000 characteristics
    4B0546C3 time date stamp Thu Nov 19 14:23:15 2009
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

          1    0 0001106E ?fnunmanaged@@YAHH@Z = @ILT+105(?fnunmanaged@@YAHH@Z)
          2    1 00011159 ?fnunmanaged@@YAHXZ = @ILT+340(?fnunmanaged@@YAHXZ)

  Summary

        1000 .data
        1000 .idata
        2000 .rdata
        1000 .reloc
        1000 .rsrc
        4000 .text
       10000 .textbss

并在声明函数时使用此名称:

[DllImport(@"D:\work\unmanaged.dll",
    EntryPoint = "?fnunmanaged@@YAHH@Z",
    ExactSpelling = true)]
static extern int fnunmanaged();

[DllImport(@"D:\work\unmanaged.dll",
    EntryPoint = "?fnunmanaged@@YAHXZ",
    ExactSpelling = true)]
static extern int fnunmanaged(int a);

另一种选择是使用 module definition file :

LIBRARY "unmanaged"
EXPORTS 
  fn1=?fnunmanaged@@YAHH@Z
  fn2=?fnunmanaged@@YAHXZ

在这种情况下,您不再需要使用 __declspec(dllexport) 并且您的头文件可能如下所示:

int fnunmanaged(void);
int fnunmanaged(int);

最后导入它们:

[DllImport(@"D:\work\unmanaged.dll")]
static extern int fn1();

[DllImport(@"D:\work\unmanaged.dll")]
static extern int fn2(int a);

关于C# DllImport MFC 扩展 DLL 和名称修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1763135/

相关文章:

c++ - 我的 c++ 项目在 vc++ 2008 中工作,但在 vc++ 2010 中不工作

c# - Process.StandardOutput.ReadToEnd() 和无关的换行符

c# - 在 C# 中向 Caller 方法发送异常

c# - 从 C# 调用 Clarion DLL

c++ - 打包 OpenCV Dll 以分发 C++ DLL

c++ - 更改添加隐藏 this 指针的方法是否会破坏二进制兼容性?

c# - COM 接口(interface)声明

c# - ObjectDataSource 无法将字符串解析为 DateTime

c++ - 如何确定进程是 32 位还是 64 位?

c++ - 如何实现 "Press Any Key To Exit"