.NET Framework 4.8中System.Diagnostics.EventLog.dll缺失问题问询
问题分析与解决方案
问题根源
你判断的完全正确,核心矛盾是不同目标框架下程序集的归属差异导致绑定冲突:
- .NET Standard 2.0 中,
System.Diagnostics.EventLog类被拆分到独立的System.Diagnostics.EventLog.dll程序集 - .NET Framework 4.8 中,该类仍属于基础类库的
System.dll,不存在独立的System.Diagnostics.EventLog.dll
当.NET Framework 4.8项目(SecondLib)引用.NET Standard 2.0的FirstLib时,编译阶段会基于.NET Standard的依赖关系生成绑定请求,但运行时(尤其是Wix自定义动作这类特殊宿主环境)找不到这个独立程序集,最终触发绑定失败。
解决方案
方案1:通过程序集重定向强制绑定到System.dll
在SecondLib的配置文件(或Wix自定义动作的配套配置文件)中添加重定向规则,让CLR将对System.Diagnostics.EventLog.dll的请求导向System.dll:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Diagnostics.EventLog" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" /> <codeBase version="4.0.0.0" href="C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.dll" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
注意:Wix自定义动作的配置文件需与自定义动作DLL同名(如
CustomAction.dll.config),且必须打包进安装包,部署时与DLL放在同一目录。
方案2:修改FirstLib的目标框架(若允许)
如果FirstLib不需要跨平台兼容,直接将其目标框架改为.NET Framework 4.8,编译时会直接引用System.dll中的EventLog类,从根源上消除绑定冲突。
方案3:用条件编译适配多框架
若FirstLib必须保留.NET Standard 2.0兼容性,可在FirstLib中通过条件编译区分框架逻辑:
#if NETFRAMEWORK // .NET Framework环境下使用System.dll中的EventLog using System.Diagnostics; #else // .NET Standard/.NET Core环境下使用独立程序集的EventLog using System.Diagnostics.EventLog; #endif
同时在FirstLib的项目文件中添加条件引用规则:
<ItemGroup> <!-- 仅非.NET Framework环境引用独立程序集 --> <PackageReference Condition=" '$(TargetFramework)' != 'net48' " Include="System.Diagnostics.EventLog" Version="6.0.0" /> </ItemGroup>
补充说明
Wix自定义动作的运行环境较为特殊,默认不会自动加载额外的程序集重定向配置,务必确保配置文件正确部署。另外可再次使用fuslogvw.exe验证重定向是否生效,查看绑定日志中是否显示成功导向System.dll。
内容的提问来源于stack exchange,提问作者cchampion
相关产品推荐
相关产品推荐

