c# - C# 程序如何使用任何版本的 C++ dll?

标签 c# c++ .net dll version

我们正在创建一个用 C++ 编写的 dll,提供对某些硬件的访问。我们还有一个使用此 dll 的 C# 程序。

我们遇到了版本问题。实际上,在运行 C# 程序时,它绝对希望使用它在编译时使用的确切 C++ dll 版本。 IE。如果 C# 程序是使用 C++ dll 1.2.3.4 编译的,则程序将拒绝使用 C++ dll 1.2.3.5 运行。

我想指示 C# 程序使用版本为 1.2.anything 的任何 C++ dll。

我可以在 C# 项目中的什么地方配置它?

此问题已被 that one 取代, 更多与 COM 相关。

最佳答案

C++ 中不存在这种花哨的东西。使用并排 list 在技术上允许这样做,但您应该知道这一点,因为您会在 C# 程序的 list 中键入版本号。

更可能的解释是您实际上创建了一个 C++/CLI 程序集。许多程序员将 C++/CLI 与 C++ 混淆。容易犯错,因为该语言允许使用 native C++ 代码。但它实际上被编译成一个混合模式程序集,一个包含 IL 和 native 代码的程序集。当 CLR 加载此类程序集时,会对其进行正常的 CLR 版本检查,它只对完全匹配的版本感到满意。强大的 DLL hell 反制措施。

并且可以使用正常的 CLR 版本争论选项来绕过此检查,<bindingRedirect> app.exe.config 文件中的元素。以及控制程序集版本号的方式与您为 C# 代码执行的方式一样,因此这不是必需的。

检查此猜测是否准确的最简单方法是使用“项目”+“添加引用”并选择 DLL。如果这没有引起任何提示并且该程序集被添加到您的 C# 项目的引用节点,那么您知道它是一个普通的 .NET 程序集。不要忘记利用这一点,不需要 pinvoke。

关于c# - C# 程序如何使用任何版本的 C++ dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17588029/

相关文章:

c# - 如何在代码隐藏中访问 JavaScript 对象 (C#/ASP.NET)

c++ - 为什么标准队列没有定义交换方法特化

c++ - 指针和引用运算符 (&)

c# - 如何使用c#从谷歌驱动器下载文件

c# - 避免 dotnetopenauth url 中的 "must contain period"限制

c# - 有什么方法可以使用 C# 在 .net 中对匿名类型进行 xml 序列化

c# - 删除 List<string> 开头和结尾的空行?

c# - Ninject 泛型集合的隐式构造函数绑定(bind)错误

c# - 从 UTF-8 转换为 ISO-8859-15 时,哪些双引号字符会自动替换?

c++ - C++ STL 中的确定性随机数流