【问题标题】:create c# .dll compatible on both .net3.5 and .net4.0在 .net3.5 和 .net4.0 上创建兼容的 c# .dll
【发布时间】:2020-04-23 20:09:48
【问题描述】:

我必须创建一个用 c# 编写的 dll。 dll 必须在机器上的两种不同类型上使用: - 已安装 .net35 但未安装 .net40 的机器A - 已安装 bot .net40 但未安装 .net35 的机器 B 目前没有在 MachineB 上安装 .net35 或在 MachineA 上安装 .net40 的选项。

我假设在 .net35 上创建 dll 将能够在 MachineB 上运行。但是当我尝试调用任何 dll 的函数时,我收到一条错误消息,指出应用程序需要安装 .net35

所以问题是这样的:是否有可能以一种在 MachineA 和 MachineB 上都兼容的方式创建 dll?

【问题讨论】:

    标签: c# .net dll compatibility


    【解决方案1】:

    您可以通过在app.config 文件中添加多个supportedRuntime 值,将您的应用配置为在两个版本的 .NET(3.5 和 4.0)上运行

    <configuration>
      <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
        <supportedRuntime version="v2.0.50727"/>
      </startup>
    </configuration>
    

    .NET Framework 4 及更高版本使用 v4.0 运行时,.NET Framework 2.0、3.0 和 3.5 使用 v2.0.50727 运行时。此外,由于您的目标是旧的 .NET 3.5,因此启用 old runtime activation policyuseLegacyV2RuntimeActivationPolicy="true" 是有意义的。

    上面的配置在 .NET 3.5 上运行您的代码,前提是只安装了这个版本。如果安装了两个版本,它将在 .NET 4.x 上运行

    你也可以看看这个 MSDN article 了解更多详情

    【讨论】:

    • 非常感谢您的及时回复!进一步的问题:C# dll 必须在 C++ 代码上使用(我知道这听起来有点奇怪,但我们已经获得了 C# 中的 dll 源代码,并且我们的主引擎在 C++ 上)。上面的配置必须在.dll项目的属性上完成吗?还是必须在 C++ 上完成?
    • 嗯,这是一个复杂的问题,取决于您使用的是哪个 C++(托管或非托管)以及您如何引用 C# dll。 app.config 文件仅适用于 .NET 世界
    • 但是我猜你必须用 3.5 的目标框架编译它。由于不允许使用 4.0 的新功能
    • 在 C# 上我使用 RGiesecke.DllExport.Metadata.dll 到 [DllExport("functionName", CallingConvention = CallingConvention.Cdecl)] 然后在 C++ 上我使用 LoadLibrary 和 GetProcAddress 从c# dll 输出 c++ 引擎。在这种情况下,我应该在 c# dll 中包含
    • @StylianosPapadopoulos 我认为是的,您应该将支持的运行时添加到配置并与 dll 一起分发。它将被编译成your_dll_name.dll.config 另外您应该将useLegacyV2RuntimeActivationPolicy="true" 添加到启动部分,我将在上面更新答案
    猜你喜欢
    • 2013-10-29
    • 2011-03-12
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多