我正在使用Roslyn将Visual Studio中的CSharpCompilation对象发送到文件。生成的DLL不包含除程序集元数据之外的任何程序集信息,并且我想添加版本并在可能的情况下对其进行签名。如何用Roslyn完成这些工作?
答案 0 :(得分:7)
您需要包含设置Assembly *属性的源代码,就像在VS C#项目模板中一样。如果您已经这样做,则设置.NET版本信息。您可以使用Reflection或ILSpy等工具阅读该信息。
这样Explorer就不会在其属性页面中显示任何版本信息。资源管理器仅显示Win32 VersionInfo而非.NET版本信息。您需要使用Rosyln发出Win32资源代码来设置这些值。幸运的是,有一种方法可以从.NET中自动生成Win32信息:CreateDefaultWin32Resources。
这是一个完整且有效的代码示例:
public void VersionInfoExample()
{
// 1. Generate AssemblyInfo.cs-like C# code and parse syntax tree
StringBuilder asmInfo = new StringBuilder();
asmInfo.AppendLine("using System.Reflection;");
asmInfo.AppendLine("[assembly: AssemblyTitle(\"Test\")]");
asmInfo.AppendLine("[assembly: AssemblyVersion(\"1.1.0\")]");
asmInfo.AppendLine("[assembly: AssemblyFileVersion(\"1.1.0\")]");
// Product Info
asmInfo.AppendLine("[assembly: AssemblyProduct(\"Foo\")]");
asmInfo.AppendLine("[assembly: AssemblyInformationalVersion(\"1.3.3.7\")]");
var syntaxTree = CSharpSyntaxTree.ParseText(asmInfo.ToString(), encoding: Encoding.Default);
// 2. Create compilation
string mscorlibPath = typeof(object).Assembly.Location;
MetadataReference mscorlib = MetadataReference.CreateFromFile(mscorlibPath, new MetadataReferenceProperties(MetadataImageKind.Assembly));
CSharpCompilationOptions options = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
CSharpCompilation compilation = CSharpCompilation.Create("Test.dll",
references: new[] { mscorlib },
syntaxTrees: new[] { syntaxTree },
options: options);
// 3. Emit code including win32 version info
using (MemoryStream dllStream = new MemoryStream())
using (MemoryStream pdbStream = new MemoryStream())
using (Stream win32resStream = compilation.CreateDefaultWin32Resources(
versionResource: true, // Important!
noManifest: false,
manifestContents: null,
iconInIcoFormat: null))
{
EmitResult result = compilation.Emit(
peStream: dllStream,
pdbStream: pdbStream,
win32Resources: win32resStream);
System.IO.File.WriteAllBytes("Test.dll", dllStream.ToArray());
}
}