在某些集成測(cè)試的準(zhǔn)備階段,我必須動(dòng)態(tài)生成一些引用其他程序集的程序集并將它們刷新到磁盤。我猜羅斯林是這項(xiàng)任務(wù)的明顯選擇。Roslyn 編譯成功完成并將發(fā)出的程序集保存到磁盤。當(dāng)我使用 ILSPy 檢查結(jié)果時(shí),我發(fā)現(xiàn)某些程序集引用未包含在內(nèi)。虛擬類生成代碼:public static string GenerateEmptyPublicClass([NotNull] string @namespace, [NotNull] string className) { if (@namespace == null) throw new ArgumentNullException(nameof(@namespace)); if (className == null) throw new ArgumentNullException(nameof(className)); var classDeclaration = SyntaxFactory.ClassDeclaration(className).AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword)); var namespaceDeclaration = SyntaxFactory.NamespaceDeclaration(SyntaxFactory.ParseName(@namespace)).NormalizeWhitespace(); namespaceDeclaration = namespaceDeclaration.AddMembers(classDeclaration); return namespaceDeclaration.NormalizeWhitespace().ToFullString(); }組裝準(zhǔn)備代碼:blic static void GenerateAssembly([NotNull] this string sourceCode, [NotNull] string assemblyFilePath, [NotNull] params string[] referencedAssemblyPaths) { if (sourceCode == null) throw new ArgumentNullException(nameof(sourceCode)); if (assemblyFilePath == null) throw new ArgumentNullException(nameof(assemblyFilePath)); var assemblyFileName = Path.GetFileName(assemblyFilePath); var outputDirectory = Path.GetDirectoryName(assemblyFilePath); Directory.CreateDirectory(outputDirectory); var syntaxTree = CSharpSyntaxTree.ParseText(sourceCode); var referencedAssemblyMetadata = referencedAssemblyPaths.Select(x => MetadataReference.CreateFromFile(x).WithProperties(new MetadataReferenceProperties())); var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary); var compilation = CSharpCompilation.Create(assemblyFileName, new[] {syntaxTree}, referencedAssemblyMetadata, compilationOptions);
- 1 回答
- 0 關(guān)注
- 181 瀏覽
添加回答
舉報(bào)
0/150
提交
取消