C# WiX自定义操作报错:无法加载Microsoft.Win32.TaskScheduler程序集
WiX自定义操作加载Microsoft.Win32.TaskScheduler程序集失败的解决方案
针对你遇到的自定义操作无法加载第三方程序集的问题,以下是几个可行的解决思路:
1. 将依赖程序集嵌入自定义操作程序集
这是最省心的方案,直接把依赖的Microsoft.Win32.TaskScheduler.dll合并到自定义操作的DLL中:
- 给自定义操作项目安装NuGet包
Costura.Fody,编译时它会自动将所有依赖的第三方程序集嵌入到输出DLL里,避免运行时找不到文件。 - 确保自定义操作项目中对
Microsoft.Win32.TaskScheduler的引用设置复制本地为True。
2. 切换到Deferred模式并确保依赖已部署
你的自定义操作当前用的是Execute.immediate,这个阶段在文件复制到目标目录前执行,依赖的DLL还没被安装,自然加载失败:
- 修改自定义操作的执行模式为
deferred,同时指定工作目录为安装目录:var runAfterInstallAction = new ElevatedManagedAction( CustomActions.RunAfterInstall, Return.check, When.After, Step.InstallFinalize, Condition.NOT_Installed) { Execute = Execute.deferred, WorkingDirectory = "APPLICATIONFOLDER", // 替换为你的安装目录属性名 ActionAssembly = typeof(CustomActions).Assembly.Location }; - 确保
Microsoft.Win32.TaskScheduler.dll被包含在安装文件列表中,比如通过Files元素复制到目标目录:new Dir(@$"%ProgramFiles%\{AppName}", new Files($@"{binPath}\*.*"), // 确保binPath下包含TaskScheduler的DLL // ...其他元素 );
3. 正确配置Binary元素(不合并程序集时)
如果不想合并程序集,需要把依赖的DLL添加到WiX的Binary表中,并确保加载路径正确:
- 先将依赖DLL添加到Binary:
project.AddBinary(new Binary("TaskSchedulerDll", @"绝对路径\Microsoft.Win32.TaskScheduler.dll")); - 同时确保自定义操作的工作目录指向依赖DLL所在的位置(比如安装目录),且执行模式为
deferred。
4. 检查兼容性
- 确认自定义操作项目的目标平台(x86/x64)与WiX项目、
Microsoft.Win32.TaskScheduler的平台一致,避免位数不兼容。 - 检查自定义操作项目的.NET Framework版本,确保与依赖程序集的要求版本匹配。
内容的提问来源于stack exchange,提问作者Eduard G
相关产品推荐
相关产品推荐

