【问题标题】:DLL not exporting classes/methods C#/C++DLL 不导出类/方法 C#/C++
【发布时间】:2016-06-17 21:58:17
【问题描述】:

我正在使用 C# 编写一个 DLL,该 DLL 将从 Delphi Windows 应用程序访问,并且遇到了重新导出类/方法的问题。无论我尝试什么,似乎都没有被导出。

我使用 Hans Passantthis question re UnmangedExports 中提供的记录方法创建了一个测试 DLL。

我使用以下代码创建了一个 C# 类库项目:

namespace ExportTestCS
{
  public class ExpTest
  {
    public static void Test()
    {
      Console.WriteLine("Hi!");
    }
  }
}

和一个 C++“包装器”来进行导出:

extern "C" __declspec(dllexport)

void  __stdcall Test()
{
    ExportTestCS::ExpTest::Test();
}

C++ 项目引用了 C# 项目,一切正常,但是当我在 DLL 上运行 dumpbin /exports 时,没有导出任何内容:

dumpbin /exports C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.dll

Dump of file C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.dll

File Type: DLL

  Summary

        2000 .reloc
        2000 .rsrc
        2000 .text

C:\Program Files (x86)\Microsoft Visual Studio 14.0>

我已经针对构建生成的所有 dll 运行了 dumpbin 以进行调试和发布,它们都给出了相同的结果。

因此,我的问题是 - 我做错了什么?我花了很长时间来寻找类似的问题,但它们似乎都可以使用 C++ 包装器或 UnmangedExports 解决。

这两个项目都是为 x86/win32 构建的,并且具有相同的目标框架 (4.5.2)。我尝试了静态类、无类、__clrcall/__stdcall 等的各种组合,但无济于事。

我之前也尝试过 UnmanagedExports NuGet 包但没有成功(这就是我找到 Hans 答案的方式)。

提前感谢您的帮助!

在所有 cmets 之后(谢谢!)我已经确认它是一个动态库项目,并且我已经在 C++ 项目中创建了一个新文件夹并将其设置为输出文件夹。构建现在将 .lib、.exp、.pdb、.dll 和 .dll.metagen 文件放入该文件夹,这是构建时输出选项卡中报告的文件夹。但是还是不开心,dumpbin 的输出还是和以前一样!!

当我对新输出文件夹中的 .lib 文件运行 dumpbin 时,我得到以下信息:

Dump of file C:\Temp\ExportTest\ExportTestCPP\ExportTest\Output\exporttest.lib

File Type: LIBRARY

     Exports

       ordinal    name

                  _Test@0

  Summary

          CC .debug$S
          14 .idata$2
          14 .idata$3
           4 .idata$4
           4 .idata$5
          10 .idata$6

C:\Program Files (x86)\Microsoft Visual Studio 14.0>

所以看起来 .lib 正在导出 Test 方法,但它不在最终的 DLL 中?

【问题讨论】:

  • 您肯定在错误的 DLL 上运行 Dumpbin.exe,因为它位于 ExportTestCS 目录中。您必须在 C++ 项目生成的 DLL 上运行它。您还必须确保您的测试项目可以找到两个 DLL。
  • 远射 - 您是否在 AssemblyInfo 中从 [assembly: ComVisible(false)] 设置了 [assembly: ComVisible(true)]?
  • 我在项目文件夹中搜索了所有 .dll 文件,但它们只存在于 C# 项目中?我会试试 AssemblyInfo 设置,看看是否有什么不同。
  • OK - 我找到了 AssemblyInfo 设置(我是 C++ 的新手!)并将 ComVisible 更改为 true(它是 false) - 但它没有任何区别。我想知道是否是其他一些配置设置阻止了 C++ 项目生成 DLL?
  • @Hans @Murray 不确定这是否有帮助 - 这是来自 C++ 构建的 ExportTest.log 的内容:Stdafx.cpp AssemblyInfo.cpp ExportTest.cpp Generating Code... .NETFramework,Version=v4.5.2.AssemblyAttributes.cpp Creating library C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.lib and object C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.exp ExportTest.vcxproj -> C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.dll ExportTest.vcxproj -> C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.pdb (Full PDB)

标签: c# c++ dll dllexport


【解决方案1】:

我刚刚尝试了您的示例,当我在 C++ dll 上运行 dumpbin 时,它对我有用,但是当我针对 C# dll 运行它时,结果与您的相同。

Dump of file C:\Temp\ExportTest\ExportTestCS\Release\ExportTest.dll

那是你的 C# 程序集吗?

【讨论】:

  • 是的,这是我的 C# 程序集 - C++ 目录中没有 .dll 文件?
  • 您可以在构建后立即在输出窗口中看到 C++ DLL 的输出文件夹。该文件夹应包含 C# 程序集和 C++ DLL。
  • 也许您选择了静态库而不是动态库?​​
  • 见上面重新输出目录/dll。每次构建时都会生成三个 dll,它们位于 C# 项目的 ...\release ...bin\release ...obj\release 文件夹中。所有项目文件夹中的其他任何地方都没有 DLL。 C# 程序集和 C++ DLL 如何位于同一个文件夹中?他们应该有相同的名字,不是吗?
  • 我刚查了一下,它是一个“动态”库项目。我认为这一定是一个项目设置,因为代码似乎对其他人都有效!
【解决方案2】:

问题一定出在我设置项目的方式上。我从头开始,一切正常。

当我设置原始的 ExportTest 项目时,我无意中为 C# 项目创建了一个 Windows 通用类库,虽然我意识到并将其更改为标准的 Windows 类库项目(删除了原来的并创建了一个新的)我相信它一定在解决方案配置中留下了一些东西,阻止了 DLL 导出。

非常感谢所有回答/评论的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    相关资源
    最近更新 更多