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
相关产品推荐
相关产品推荐

