VC++ 从解决方案中的非 /clr 项目的函数调用 /clr 项目的函数

2024-02-16

我提到这个有点类似的问题 https://stackoverflow.com/questions/3994073/calling-a-function-from-a-win32-lib-project-with-clr-from-a-project-that-is-a在问这个之前,但无法解决我的问题

我正在查看一个包含许多解决方案的旧应用程序。问题出现在其中一个解决方案中(比如 S)。情况如下:

  • S 内的项目(比如 P1)拥有所有 C/C++ 文件,需要调用 C# 函数
  • 由于 P1 还包含 .c 文件,因此我无法使用/clr选项与 那
  • 如果我将 P1 中的 .c 文件编译为 .cpp 文件,那么它会生成很多 错误,我不打算更改旧版 .c 文件中的源代码
  • 所以我创建了另一个项目(比如 P2)/clr启用并创建一个头文件 函数声明和函数定义的 .cpp 文件;这 在其下进行C#调用; P2 编译良好
  • 请注意,P1 是一个 .dll,P2 创建为静态库;
  • P2在P1的“框架和参考文献”下提到

和一个警告:

警告 LNK4098:defaultlib“MSVCRT”与其他库的使用冲突; 使用 /NODEFAULTLIB:库

现在有了这些,我在 P1 中得到了 3 个链接器错误:

错误 LNK2005:“私有:__thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已在中定义 libcmtd.lib(typinfo.obj)

错误 LNK2005:“私有:类 type_info 和 __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) 已在中定义 libcmtd.lib(typinfo.obj)

错误LNK1169:找到一个或多个多重定义的符号

许多在线论坛(包括本网站)均出现此错误。但不知何故,在尝试这些选项后我无法修复它(我是 .NET 框架的新手)。
重要的一点是,即使我从 P2 中删除 C# 代码,也会出现相同的错误。

正确的修复方法是什么?

Update:

P2 仅包含 1 个带有函数声明的头文件和 1 个带有函数定义的源文件,这是对 C# 方法的 1 行调用;例如

void Class::foo () {  // A static function inside Class
  std::string x = marshal_as<std::string>(C#_function);
  // ...
}

新添加P2来编译/clr(删除 P2 可以使解决方案编译良好)。
我正在编译 P1 和 P2/MD[d]选项。而上面的错误是P1抛出的。

如果我将 P2 从静态库(.lib)制作为动态链接库(.dll),那么上述错误就会消失。新的链接器错误来自foo本身用于未定义的参考:

错误 LNK2019:无法解析的外部符号“public:void __cdecl Class::foo()" 在函数 { P1 的某个函数 } 中引用


经过大量的尝试和错误以及 StackOverflow 内外的互联网搜索,我终于能够解决这个问题。至少链接器错误消失了,不知道还会弹出什么其他东西,但这是一个好兆头。
我将尝试在下面尽可能多地记录:

换句话说,问题是:

如何将同一个项目下的2个dll链接在一起/clr和其他非clr?

实际问题简介:

  • 一切都工作正常,直到一个需求出现在其中之一 解决方案,我必须调用 C# 模块。
  • 为了调用 C# 代码(或托管代码),该项目必须是/clr project
  • 一个项目可以是/clr,如果它包含所有 .cpp 代码并且没有 .c 代码
  • 就我而言,解决方案中的主项目包含 .c 文件; 如果我尝试使用 .cpp 选项编译它,那么它将给出很多 错误,由于遗留原因我无法更改该文件
  • 所以最好的选择是使用 .h 和 .cpp 文件创建一个新项目 其中将包含接口方法及其实现 (分别调用 C# 或 C++/CLI)

到目前为止一切都很好,但是当新项目(P2)函数定义未与原始项目(P1)链接时就会出现问题。它给出了各种链接器错误。

解决方案:

这些步骤是针对新手用户(如我)使用 VC++2010 进行的。

配置P1:

  • 右键单击解决方案 S 并Add -> New Project -> Other languages -> VC++ -> CLR empty project并将其命名(比如 P2);在项目的适当部分添加头文件和 .cpp 文件
  • 这会自动设置Properties -> Configuration Properties -> C/C++ -> Code Generation -> Runtime Library to Multi threaded DLL: /MD[d];这是必不可少的
  • 对于原始项目P1,添加适当的包含 下的路径Properties -> Configuration Properties -> C/C++ -> General -> Additional Include Directories;这样你就可以包括 P2 的新头文件位于 P1 源文件中的任意位置
  • 再次对于项目 P1,请转到Properties -> Common Properties -> Framework and Reference -> Add New Reference你应该能够 在那里看到P2;只需添加它

配置P2:

  • 第一步是可选的,因为即使没有,构建也会成功 那,但我正在记录;Properties -> Common Properties -> Framework and References -> Add New Reference -> <Select the C# or whatever external DLL you would want to call from P2>
  • 对于新项目P2,将配置设置为DLL under Properties -> Configuration Properties -> General -> Project Defaults -> Configuration Type -> Dynamic Library (DLL)
  • 如果对项目 P2 有意义,您应该在同一页面中设置 这Output Directory and Intermediate Directory也与 P1 同步(不完全相同)
  • 再次对于项目 P2 转到Properties -> Configuration Properties -> Linker -> General -> Ignore Import Library -> No;我这样做是因为 P1也是这样
  • 现在最重要的部分:无论你在里面添加了什么类 P2的新头文件,我们需要提到__declspec(dllexport) (or __declspec(dllimport),不确定,但是 两者都有效);我从这里得到了这个重要信息这个问题 https://stackoverflow.com/questions/1201959/how-do-i-reference-one-vc-project-from-another-in-the-same-project and 这个问题 https://stackoverflow.com/questions/8863193/what-does-declspecdllimport-really-mean

通过以上步骤就构建成功了!
可能可能会遗漏一些东西,因此我面临一些运行时问题。不过,至少我能够在同一个解决方案下链接 2 个 DLL 项目,它们有和没有/clr.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VC++ 从解决方案中的非 /clr 项目的函数调用 /clr 项目的函数 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 重载<<的返回值

    include
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • C# 中的链接属性和意外结果

    我只是快速浏览了一下本文 http blogs msdn com ricom archive 2006 09 07 745085 aspx 特别是关于为什么他选择使用结构 字段而不是类 属性 并看到这一行 属性的结果不是真正的左值 因此我们
  • 同步算法

    有什么好的同步算法参考吗 我对在多个用户之间同步以下类型数据的算法感兴趣 日历 文件 列表和大纲 我不仅仅是在寻找目录内容的同步a la rsync http en wikipedia org wiki Rsync 我有兴趣合并单个文件中的
  • 如何在 Angular2 材质表中映射动态标题和表内容

    我在带有动态表内容和标题的 Angular 材料表中遇到问题 这是我的表的 JSON 数据 let dataobj key Data1 value ENF key Data2 value 10598489700 key Data3 valu
  • 滚动RecyclerView时Cardview的数据发生变化

    我是一名初级 Android 开发者 我用 CardView 制作了一个应用程序 但是当我滚动 RecyclerView 时 它正在更改其内容 Video http sendvid com 60ui8cay http sendvid com
  • 如何强制复选框的文本不换行?

    这就是我的 LinearLayout 水平 行的样子 我希望复选框的文本在一行上 按钮不必那么宽 它们仍然有足够的空间 并且复选框文本稍微加长 我的 XML 中的内容
  • 仅列出当前目录中超过 x 天的所有文件

    我是 unix 新手 在其他问题中无法得到适当的结果 我只想列出当前目录中早于 x 天的文件 我有以下限制 仅列出当前文件夹中早于 30 的文件 天 输出不应包含目录和子目录 这应该列出类似于 ls 命令的文件 输出应该是这样的file1
  • Objective-C:何时知道您正在滥用全局变量的 SIngleton 方法

    因此 我的客户 iPhone 应用程序在过去几周内已从 5 个左右的课程增加到超过 25 个课程 对于如此大的 无论如何对于 iPhone 来说 类结构 我一直在利用 Singleton 类来访问全局变量 问题是 每当我需要访问我正在处理的
  • NSString、NSNumber 类型属性中,保留还是复制哪个更好? (NSArray 怎么样?)

    如果对象具有 type 属性NSString or NSNumber 哪个更好 retain or copy 我认为这些对象是不可变的 不能改变对象的状态 所以复制更好 我看到了为什么复制比分配 NSMutableString 并更改它更好
  • 如何在数据库级别为一对多关联设置唯一性?

    我的问题很简单 但我找不到任何 GORM 语法 考虑下面的类 class Article String text static hasMany tags String static constraints tags unique true
  • 如何分配给锯齿状数组?

    我正在编写一个简短的程序 最终将玩四连棋 到目前为止 pastebin https pastebin com wk5crs7g 有一个部分不起作用 我在第 16 行声明了一个锯齿状数组 char board Enumerable Repea
  • 将 Eclipse 工作区从 ~ 移动到新目录?

    好吧 我犯了一个错误 将我的主目录 又名 home user 设置为 RHEL6 机器上的工作区位置 我想将我的工作空间更改为 workspace 但是 我似乎无法通过复制文件来做到这一点 对于一些背景 我当前正在处理并已在 工作区下完全设
  • java.lang.NoSuchFieldError:DEF_CONTENT_CHARSET

    我正在尝试运行 java 程序 但收到以下运行时错误 错误如下所示 Exception in thread main java lang NoSuchFieldError DEF CONTENT CHARSET at org apache
  • Elastic Search:常规过滤器和条件过滤器

    我正在使用弹性搜索 带有查询 match all 和过滤 在我的情况下 我想应用通用过滤器并按条件过滤 这里是伪的 查询 匹配所有 工作正常 过滤 d1 和 d2 之间的日期范围 没有项目符号 3 也能正常工作 过滤器 仅在字段存在时应用
  • 为什么存在“DatabaseGenerateOption.None”?

    这与使用Property gt p HasDatabaseGeneratedOption 称呼 是否可能关闭默认数据库值生成 EF uses DatabaseGeneratedOption找出如何处理新实体的键列的值 如果DatabaseG
  • 类型“PromiseLike”上不存在属性“catch”

    我在以下代码中收到此错误 我正在使用 ionic3 类型 PromiseLike 上不存在属性 catch 这是链接到tutorial https www youtube com watch v 1wU9N7VxoS8我正在关注 此错误显示
  • JTextField 固定高度

    我如何获得JTextField当框架最大化时有固定的高度 我希望它看起来有点类似于 Ubuntu 上的 Skype 应用程序 private JTextField username private JPasswordField passwo
  • 使用 dplyr / tidyverse 删除基于多列的重复行?

    我想使用 dplyr tidyverse 删除基于 gt 1 列的重复行 Example library dplyr df lt data frame a c 1 1 1 2 2 2 b c 1 2 1 2 1 2 stringsAsFac
  • 如何使用 MongoDB 转移资金?

    Account has embedded Transactions amount positive for received transactions negative for outgoing transactions 用户想要汇款 我们
  • Excel VBA 的 LIFO(堆栈)算法/类

    我正在寻找在 Excel 的 VBA 中实现 Stack 类 我想使用后进先出结构 以前有人遇到过这个问题吗 你知道外部库处理结构 如 Stack Hastable Vector 除了原始的 Excel Collection 等 Thank
  • VC++ 从解决方案中的非 /clr 项目的函数调用 /clr 项目的函数

    我提到这个有点类似的问题 https stackoverflow com questions 3994073 calling a function from a win32 lib project with clr from a proje