将非托管 C++ dll 添加到托管 C++ dll

Posted

技术标签:

【中文标题】将非托管 C++ dll 添加到托管 C++ dll【英文标题】:Adding an unmanaged C++ dll to a managed C++ dll 【发布时间】:2012-12-13 00:30:52 【问题描述】:

我正在尝试将非托管 C++ dll 添加到托管 (CLI) C++ dll 项目。当我单击“类向导”时,我收到“MFC 类只能添加到 MFC 项目”错误消息。据我所知,我没有使用 MFC(在我的非托管 dll 的项目页面下,使用 MFC 是空白的)。是否有另一种方法可以将非托管 dll 添加到我的托管 dll 的项目中?

对于任何感兴趣的人,我已经在我的 DropBox 帐户中提供了罕见的解决方案:https://dl.dropbox.com/u/98752313/CplusplusArrayTest.rar

我意识到有太多设置可能对我来说是错误的,无法简单地将所有内容复制并粘贴到可用空间中。

此解决方案包含三个项目。 CplusplusArray(应该是完整的,是非托管的.dll),ManagedCpluspplusArray(需要添加非托管的dll,并修改一些东西,是托管的.dll),还有一个C#测试程序(还没写,希望能和大佬交流)非托管 dll 通过托管 dll)。

如果您想知道的话,这个项目的整个目标是让 C# 能够使用带有 long 的数组作为索引器。如果您以前使用过任何数量的 .Net,您可能已经遇到了 CLR 中对象大小的 Int32/Uint32 限制。我希望通过在 C++ 领域实现数组,然后针对它修改/编译一些 Mono Collections.Generics 类来解决这个问题,从而给我们一些喘息的空间。我做 C# -> C++/CLI -> C++ 的原因是,根据我的研究,我们可以使用面向对象的代码; DllImport 的东西只适用于类 C 函数,我想保留 OOP,而不是修改东西以像 C 一样工作。由于数组是 List / etc. 类的构建块,据我所知,Collections 命名空间,让它们在 64 位土地上运行将为我们提供其他一切。

【问题讨论】:

【参考方案1】:

您需要添加一个新项目,而不是一个新类。一旦你“添加项目”,你会被问到你想添加什么类型的项目,一个普通的 C++ DLL 将是你的选择之一。

在解决方案中拥有两个项目(C++/CLI DLL 项目和 C++ DLL 项目)后,您可以转到工作区依赖项并指出其中一个依赖于另一个。


补充说明:

类向导是关于添加 MFC 类的。因为您对添加 MFC 类不感兴趣,所以这不是正确使用的工具。

当我编写了一个使用原生 C++ DLL 的 C++/CLI DLL 时,我需要添加指令以链接到 C++ DLL 的导入库。这是在以下位置配置的: “项目属性 > 配置属性 > 链接器 > 输入 > 附加依赖项”

工作区依赖保证首先构建非托管库,并且如果更新了非托管库,托管库将在需要时重新编译或重新链接。

【讨论】:

请允许我重申一下 -> 解决方案中现在有 3 个项目。一个项目是 C++ dll,另一个是托管 C++ dll,第三个是 C# WinForms 测试器。我遇到的问题是 C++ dll 似乎不想添加到托管 C++ dll 项目中,因为它似乎认为它是一个启用 MFC 的 dll(我已经做了我能想到的所有事情清除 MFC,无济于事)。但是,我将研究“工作空间依赖项”,看看是否可以解决问题。 好的,我刚刚重新阅读了您的问题。让我在上面添加一些额外的注释。

以上是关于将非托管 C++ dll 添加到托管 C++ dll的主要内容,如果未能解决你的问题,请参考以下文章

将非托管 c++ 类库暴露给 c#

将非托管 DLL 部署到输出目录

从非托管 dll 文件(注入到正在运行的进程中)调用托管 dll

将非托管 EXE 作为资源合并到托管 C# 代码中

使用来自 C# 的托管 C++ dll

如何将非托管 dll 和托管程序集合并到一个文件中?