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

C++/CLR程序集版本号无法嵌入,C#中显示0.0.0.0求助

解决C++/CLR DLL在C# WinForms应用中显示版本为0.0.0.0的问题

我帮你梳理下这个问题的根源和解决办法——你遇到的其实是C++/CLR项目里原生PE版本和托管程序集版本不同步导致的:文件属性里能看到的正确版本是原生PE的版本,但C#代码识别的是托管元数据中的程序集版本,这两者没对齐就会出现显示0.0.0.0的情况。下面是具体的修复步骤:

1. 同步托管程序集版本与原生版本

C++/CLR项目的版本信息分两块管理,首先要确保项目属性里的托管版本和version.h里的原生版本一致:

  • 右键你的C++/CLR DLL项目 → 属性 → 配置属性 → 常规
  • 在右侧面板中,把程序集版本和文件版本都设置为你想要的版本号(比如1.0.0.0)
  • 这个版本号要和version.h里定义的FILEVERSION、PRODUCTVERSION完全匹配,避免版本不一致的问题

2. 检查并配置AssemblyInfo.cpp文件

如果你的项目里没有这个文件,需要手动添加来托管程序集的元数据:

  • 右键项目 → 添加 → 新建项 → 选择「C++ 文件(.cpp)」,命名为AssemblyInfo.cpp
  • 在文件中插入以下代码,替换成你的版本信息:
using namespace System::Reflection;
using namespace System::Runtime::CompilerServices;
using namespace System::Runtime::InteropServices;

// 托管程序集版本
[assembly:AssemblyVersionAttribute(L"1.0.0.0")];
// 托管文件版本(和原生版本同步)
[assembly:AssemblyFileVersionAttribute(L"1.0.0.0")];
// 可选:产品信息版本
[assembly:AssemblyInformationalVersionAttribute(L"1.0.0")];
  • 保存后重新生成项目,这样托管程序集就会带上正确的版本元数据

3. 验证托管元数据是否正确生成

生成DLL后,可以用.NET自带的反汇编工具确认版本:

  • 打开VS2015的开发者命令提示符
  • 运行命令:ildasm.exe YourCLRDll.dll(替换成你的DLL文件名)
  • 在弹出的窗口中,双击MANIFEST节点,查看assemblyIdentity标签里的version属性是否为你设置的版本
  • 如果这里版本正确,那C#项目引用后就能识别到正确版本了

4. 清理VS缓存避免旧元数据残留

有时候VS会缓存旧的元数据,导致显示异常,需要手动清理:

  • 右键C#项目中的DLL引用 → 移除
  • 分别右键C++/CLR项目和C#项目 → 清理,删除旧的生成文件
  • 重新生成C++/CLR项目,再重新添加引用到C#项目
  • 关闭VS,删除项目目录下的.vs隐藏文件夹,重新打开项目加载最新的元数据

额外注意事项

  • 确保version.h里的版本定义是正确的,比如:
#define FILEVERSION 1,0,0,0
#define FILEVERSION_STR "1.0.0.0"
#define PRODUCTVERSION 1,0,0,0
#define PRODUCTVERSION_STR "1.0.0.0"
  • 不要在app.rc里硬编码版本号,要通过version.h的宏来引用,保持两处版本的一致性
  • 确认C++/CLR项目和C#项目的目标平台一致(比如都是x86或x64),平台不匹配也可能导致元数据读取异常

内容的提问来源于stack exchange,提问作者Dave Gahan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:30:58