使用Roslyn编译DLL后运行时无法加载SharedLib.dll如何解决?
问题根因
你在调用CSharpCompilation.Create创建编译实例时,第一个参数传入了带.dll后缀的"SharedLib.dll",而这个参数对应的是程序集的内部标识名称(AssemblyName),不是输出文件名。这会导致你编译出的DLL内部程序集名称为SharedLib.dll,而非正常的SharedLib。
当测试项目引用该DLL后,运行时CLR会按照程序集名称自动附加.dll后缀查找文件,也就是会尝试找SharedLib.dll.dll,自然和你放在同目录的SharedLib.dll匹配不上,就抛出了文件找不到的异常。你可以看报错信息里要求加载的程序集名称自带.dll后缀,也直接印证了这个问题。
解决方案
修改你的Roslyn编译代码,将CSharpCompilation.Create的第一个参数改为不带后缀的程序集名称即可:
// 原错误写法 // CSharpCompilation.Create("SharedLib.dll") // 修改为 CSharpCompilation.Create("SharedLib")
修改后重新编译DLL,替换原有引用的DLL,重新编译测试项目即可正常运行。
可选排查点
如果修改后仍有问题,可以额外检查两项配置:
- 确认Roslyn编译时引用的基础程序集是.NET Framework 4.8版本的mscorlib,避免跨框架引用问题:你当前代码里用
typeof(object).Assembly.Location获取引用路径,如果运行Roslyn编译逻辑的项目本身是.NET Framework 4.8,这个取值是正确的;如果该项目是.NET Core/.NET 5+,这个路径会指向CoreCLR的mscorlib,导致生成的DLL和.NET Framework 4.8不兼容。 - 确认生成的DLL和测试项目的平台目标一致(同为AnyCPU、x86或x64),避免平台不匹配导致的加载失败。
内容的提问来源于stack exchange,提问作者jing
相关产品推荐
相关产品推荐

