You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从非托管代码调用.NET 6(C#)类库?寻求适配.NET 6的RGiesecke.DllExport替代NuGet包

寻找.NET 6兼容的UnmanagedCode替代方案,实现MetaTrader 4调用C#类库

我此前基于.NET Framework 4.6.1开发C#类库,通过UnmanagedCode(RGiesecke.DllExport)实现MetaTrader 4(非托管代码)对该类库的调用。现计划升级至.NET 6构建新项目,但发现RGiesecke.DllExport自2015年起未再更新,在VS 2022中使用时会触发NU1701兼容性警告:

Package 'UnmanagedExports 1.2.7' was restored using '.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4.7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8' instead of the project target framework 'net6.0-windows7.0'. This package may not be fully compatible with your project.

导致无法正常编译。特此咨询:是否存在专为.NET 6设计的替代NuGet包,可实现从非托管代码调用.NET 6 C#类库的功能?

示例代码如下:

using RGiesecke.DllExport;
namespace HGTrader {
    public static class HGTrader {
        [DllExport("DoTradingCalculations", CallingConvention = CallingConvention.StdCall)]
        public static int DoTradingCalculations(double ask, double bid, double balance, double equity) {
            //return tradeEngine.ChangeList.Count;
            return 0;
        }
    }
}

回答

嘿,我之前也碰到过一模一样的迁移难题——RGiesecke的DllExport确实早就停更了,对.NET Core及以后的版本支持拉胯得很。不过好在有几个靠谱的替代方案,专门适配.NET 6+,给你梳理一下:

1. DllExport (Community Edition)

这是社区维护的RGiesecke.DllExport分支,完全兼容.NET 5/6/7/8,用法和你原来的代码几乎无缝对接,迁移成本最低。

你只需要卸载原来的UnmanagedExports包,安装社区版的DllExport(NuGet直接搜就能找到),然后把命名空间从RGiesecke.DllExport改成DllExport就行。修改后的代码大概是这样:

using DllExport;
namespace HGTrader {
    public static class HGTrader {
        [DllExport("DoTradingCalculations", CallingConvention = CallingConvention.StdCall)]
        public static int DoTradingCalculations(double ask, double bid, double balance, double equity) {
            // 你的业务逻辑
            return 0;
        }
    }
}

编译的时候不会再出现NU1701警告,生成的DLL也能被MetaTrader 4正常调用。我自己迁移的时候先用的这个,几乎没改代码就搞定了。

2. .NET Native AOT(官方方案)

如果你追求最高性能,不想依赖第三方包,那.NET 6+自带的NativeAOT是绝佳选择。它可以直接把你的C#代码编译成原生的非托管DLL,不需要CLR运行时,启动更快、内存占用更低。

步骤也不复杂:

  • 在你的.NET 6类库项目中,右键属性 -> 生成 -> 启用"Publish Native AOT"(需要提前安装.NET 6+的AOT组件)
  • 在项目文件(.csproj)中添加以下配置:
    <PropertyGroup>
      <PublishAot>true</PublishAot>
      <RuntimeIdentifier>win-x64</RuntimeIdentifier> <!-- 对应你的MT4架构,32位就用win-x86 -->
    </PropertyGroup>
    
  • 编写导出方法时,使用.NET官方的[UnmanagedCallersOnly]属性,指定调用约定:
    using System.Runtime.InteropServices;
    namespace HGTrader {
        public static class HGTrader {
            [UnmanagedCallersOnly(EntryPoint = "DoTradingCalculations", CallingConvention = CallingConvention.StdCall)]
            public static int DoTradingCalculations(double ask, double bid, double balance, double equity) {
                // 你的业务逻辑
                return 0;
            }
        }
    }
    
  • 发布项目后,就能得到可以被MT4调用的原生DLL了。

注意:NativeAOT对某些.NET特性(比如反射动态生成代码)支持有限,如果你的类库用了这类特性,可能需要调整代码。

3. CsWin32(微软官方工具)

微软的CsWin32主要是用来导入非托管API,但也支持导出方法。它的优势是能提供更精细的类型控制,适合复杂的交互场景,但配置相对麻烦一点。

你需要安装Microsoft.Windows.CsWin32 NuGet包,然后在项目中添加一个.cs文件,用特殊的注释来声明导出方法,工具会自动生成对应的导出代码。不过对于你的场景来说,前两个方案已经足够好用了,这个可以作为备选。

总结

如果想最快完成迁移,优先选DllExport (Community Edition),几乎不用改代码;如果追求性能和无第三方依赖,就用NativeAOT;复杂场景再考虑CsWin32。

内容的提问来源于stack exchange,提问作者Dennis Gundersen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 18:03:15