gpt4 book ai didi

c# - 无法使用/调试来自 C# 的非托管 DLL

转载 作者:行者123 更新时间:2023-11-28 02:02:38 27 4
gpt4 key购买 nike

我有一个 C# 应用程序和一个 C++ DLL,都是 x86。应用程序是启动项目,DLL 项目在同一解决方案中,并作为项目引用。 C++ DLL 在应用程序的调试文件夹中输出与 DLL 同名的 PDB 文件。

我有一个名为 SomeFunction 的函数,我试图在 C# 中执行它。当代码到达该行时,它就停在那里。 C# 应用程序的 UI 继续响应,但断点永远不会离开该行(在 Form_Load 中)。

如果我尝试将 DLL 设置为启动项目并告诉它执行 C# 应用程序,那么 C# 将在该行崩溃并显示:System.EntryPointNotFoundException:无法在 DLL“SomeDLL”中找到名为“SomeFunction”的入口点。 dll'.

这是我要调用的函数的声明:

[DllImport("SomeDLL.dll", EntryPoint = "SomeFunction", CallingConvention = CallingConvention.Cdecl)]
public static extern int SomeFunction(IntPtr hwnd);

这是来自 C++ header 的函数声明:

#define MYDLL_API __declspec(dllexport)
MYDLL_API extern int SomeFunction(HWND hWnd);

这就是我在 C# 中的调用方式:

var someAnswer = SomeFunction(_hwnd);

更新:由于下面的讨论可能需要一些时间来阅读,所以简而言之就是答案:我缺少一个外部“C”。此外,为了调试 DLL(这也是一个问题),该项目需要支持从 C++ 和 C# 进行 native 调试,这是我经历过的一个很好的列表,最后一切都很好!

No Symbols loaded in mixed C# C(win32) project using VS2010

最佳答案

  1. 运行调用 SomeFunction 的代码以确保加载非托管 .dll
  2. 进入调试 -> Windows -> 模块并检查 .dll 路径和 symbols 状态。您可以尝试在该窗口中的 c++ dll 的上下文菜单中加载 symbols

(经常发生 .net 加载不同(非预期)版本的非托管 .dll)

现在我很确定问题出在您导出的函数名称被破坏了。尝试像这样定义函数:

extern "C" MYDLL_API int PASCAL SomeFunction(HWND hWnd);

在 C# 中:

[DllImport("SomeDLL.dll")]
public static extern int SomeFunction(IntPtr hwnd);

关于c# - 无法使用/调试来自 C# 的非托管 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38815465/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com