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

能否在X++代码中无需添加引用即可使用C# .dll文件?

解决X++项目跨机器引用C# DLL无需重复添加的问题

方法一:将DLL纳入项目目录,使用相对路径引用

  • 把生成的C# DLL放到X++项目内的固定子目录,比如在项目根目录新建ExternalAssemblies文件夹,将DLL移入其中。
  • 添加引用时选择该本地目录的DLL,然后在引用属性中:
    • 把Copy Local设为True,确保构建时DLL会被自动复制到输出目录。
    • 确认引用路径为相对路径(不要用绝对路径),避免因其他机器的盘符、文件夹结构不同导致路径失效。
  • 将该DLL及对应目录一并提交到代码仓库,确保其他机器克隆项目后能直接获取到DLL文件。

方法二:X++动态加载DLL(无需静态引用)

如果不想依赖项目的静态引用,可以直接在X++代码中动态加载DLL并调用,示例代码如下:

System.Type          targetType;
System.Object        classInstance;
System.Reflection.Assembly loadedAssembly;
System.Exception     loadException;

try
{
    // 用项目相对路径定位DLL,保证所有机器路径一致
    loadedAssembly = System.Reflection.Assembly::LoadFrom(@".\ExternalAssemblies\YourCSharpLibrary.dll");
    // 替换为你的C#类完整命名空间+类名
    targetType = loadedAssembly.GetType("YourCompany.YourCSharpNamespace.YourClass");
    // 创建类实例
    classInstance = Activator::CreateInstance(targetType);

    // 调用C#类的无参方法,有参数则最后一个参数传参数数组
    targetType.InvokeMember("YourPublicMethod", 
        System.Reflection.BindingFlags::Public | System.Reflection.BindingFlags::Instance | System.Reflection.BindingFlags::InvokeMethod,
        null, classInstance, null);
}
catch (Exception::CLRError)
{
    loadException = CLRInterop::getLastException();
    error(strFmt("加载或调用C# DLL失败: %1", loadException.ToString()));
}
  • 这种方式彻底规避了跨机器静态引用失效的问题,但需要做好异常处理,比如捕获DLL找不到、类型不存在等场景。
  • 建议始终用项目相对路径定位DLL,确保所有克隆项目的机器都能正常找到文件。

方法三:配置系统DLL搜索路径

  • 将DLL所在目录添加到机器的PATH环境变量中,系统会自动搜索该目录下的DLL。团队协作时可以写个脚本,在克隆项目后自动配置该环境变量。
  • 或者在X++项目的构建事件中添加脚本,将DLL复制到AX的默认程序集搜索目录(比如\bin\XppIL),让AX运行时自动识别该DLL。

注意事项

  • 确保C# DLL的目标框架与AX版本兼容,多数AX版本要求使用.NET Framework 4.x,避免用过高版本。
  • 提交代码时不要忽略DLL文件,必须将其纳入仓库,否则其他机器克隆后仍无法获取。
  • 动态加载时一定要添加异常捕获,防止DLL加载失败导致X++代码崩溃。

内容的提问来源于stack exchange,提问作者No Name

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 02:32:18