如何使用Roslyn为动态编译的DLL添加属性/详情?
给Roslyn动态生成的DLL添加文件属性/详情的方法
要给Roslyn运行时编译出的DLL加文件详情,核心是在编译阶段注入程序集级别的特性,这些特性会自动映射到DLL属性里的公司、版本、描述等字段,具体操作如下:
1. 定义程序集特性代码
先写一段包含程序集特性的代码片段,对应你要设置的各项文件属性:
using System.Reflection; // 对应文件详情里的"公司"字段 [assembly: AssemblyCompany("你的公司名称")] // 对应"产品名称"字段 [assembly: AssemblyProduct("你的产品名")] // 对应"产品版本"字段 [assembly: AssemblyVersion("1.0.0.0")] // 对应"文件版本"字段 [assembly: AssemblyFileVersion("1.0.0.0")] // 对应"描述"字段 [assembly: AssemblyDescription("运行时动态编译生成的DLL文件")] // 可选:添加版权信息,对应"版权"字段 [assembly: AssemblyCopyright("Copyright © 2024 你的公司")]
2. 将特性代码加入Roslyn编译流程
把上面的特性代码和你的业务代码一起作为编译单元,传入Roslyn的CSharpCompilation对象中,示例代码:
// 你的业务逻辑代码 string businessCode = @" namespace DynamicModule { public class DynamicService { public string GetMessage() => ""从动态DLL返回的消息""; } }"; // 程序集特性代码 string assemblyAttrCode = @" using System.Reflection; [assembly: AssemblyCompany(""MyTechCorp"")] [assembly: AssemblyProduct(""DynamicRuntimeDLL"")] [assembly: AssemblyVersion(""1.0.0.0"")] [assembly: AssemblyFileVersion(""1.0.0.0"")] [assembly: AssemblyDescription(""Roslyn运行时编译生成的动态链接库"")] [assembly: AssemblyCopyright(""Copyright © 2024 MyTechCorp"")]"; // 解析代码为语法树 var businessSyntaxTree = CSharpSyntaxTree.ParseText(businessCode); var attrSyntaxTree = CSharpSyntaxTree.ParseText(assemblyAttrCode); // 设置编译选项,指定输出为DLL var compileOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary); // 创建编译对象,包含业务代码和特性代码的语法树 var compilation = CSharpCompilation.Create( assemblyName: "DynamicAssembly.dll", syntaxTrees: new[] { businessSyntaxTree, attrSyntaxTree }, references: new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location) }, options: compileOptions ); // 生成DLL文件 using var memoryStream = new MemoryStream(); var emitResult = compilation.Emit(memoryStream); if (emitResult.Success) { // 将生成的DLL写入磁盘 File.WriteAllBytes("DynamicAssembly.dll", memoryStream.ToArray()); }
3. 验证效果
编译完成后,找到生成的DLL文件,右键→属性→详细信息,就能看到你设置的所有属性已生效,和你示例图里的字段对应一致。
内容的提问来源于stack exchange,提问作者Boppity Bop
相关产品推荐
相关产品推荐

