Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序如何使用C++;任何版本的dll? 我们正在创建一个用C++编写的DLL,提供对一些硬件的访问。我们还有一个C#程序使用这个dll_C#_C++_.net_Dll_Version - Fatal编程技术网

C程序如何使用C++;任何版本的dll? 我们正在创建一个用C++编写的DLL,提供对一些硬件的访问。我们还有一个C#程序使用这个dll

C程序如何使用C++;任何版本的dll? 我们正在创建一个用C++编写的DLL,提供对一些硬件的访问。我们还有一个C#程序使用这个dll,c#,c++,.net,dll,version,C#,C++,.net,Dll,Version,我们的版本有问题。实际上,当运行C++程序时,它绝对希望使用编译时使用的精确的C++ DLL版本。也就是说,如果C++程序是用C++ DLL1.2.3.4编译的,那么程序将拒绝用C++ DLL1.2.3.5运行。 我想指导C程序使用任何版本1.2的C++ DLL。任何东西。 我可以在C#项目中的何处配置此功能 这个问题已被与COM更相关的问题所取代。在运行时加载dll并使用反射调用其方法 Assembly assembly = Assembly.LoadFrom("C:\\test.dll");

我们的版本有问题。实际上,当运行C++程序时,它绝对希望使用编译时使用的精确的C++ DLL版本。也就是说,如果C++程序是用C++ DLL1.2.3.4编译的,那么程序将拒绝用C++ DLL1.2.3.5运行。 我想指导C程序使用任何版本1.2的C++ DLL。任何东西。 我可以在C#项目中的何处配置此功能


这个问题已被与COM更相关的问题所取代。

在运行时加载dll并使用反射调用其方法

Assembly assembly = Assembly.LoadFrom("C:\\test.dll");

Assembly.GetTypes();

Activator.CreateInstance(type);

我认为不可能将您的程序配置为使用1.2.*版本而不使用其他版本。除非你自己写代码。另一种可能是不改变C++ DLL的版本标记,但它似乎并不是你想要的。 避免版本依赖性的解决方案是使用dllimport。您可以用它加载任何用C++编写的DLL。它没有版本依赖性。请参见最后msdn和链接中的示例:

using System;
using System.Runtime.InteropServices;

class Example
{
 // Use DllImport to import the Win32 MessageBox function.
 [DllImport("user32.dll", CharSet = CharSet.Unicode)]
 public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);

 static void Main()
 {
     // Call the MessageBox function using platform invoke.
    MessageBox(new IntPtr(0), "Hello World!", "Hello Dialog", 0);
 }
}


< C++ >中没有这种幻想存在。从技术上讲,使用并行清单可以做到这一点,但您应该知道这一点,因为您应该在C#程序的清单中键入版本号

更可能的解释是您实际创建了一个C++/CLI程序集。许多程序员混淆C++和CLI和C++。容易出错,因为该语言允许使用本机C++代码。但它实际上被编译成一个混合模式程序集,一个包含IL和本机代码的程序集。当CLR加载这样的程序集时,会对其进行常规的CLR版本检查,它只对精确的版本匹配感到满意。一个强有力的对策

正常CLR版本争用选项可用于绕过此检查,即app.exe.config文件中的
元素。以及控制程序集版本号,就像控制C#代码一样,因此这是不必要的


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

您的C程序如何使用此dll?您是否使用C++/CLI汇编?请添加一些有关如何构建软件的详细信息…@alexbuisson dll未使用C++/CLI。dll被编译成本机可执行文件。哦,好的。你不能动态加载C++ DLL吗?