所以我正在开发一个基于Roslyn的前端编译器,它解析一个C#解决方案,在语法树上执行重写以消除我的DSL的一些构造,然后使用Roslyn API来编译和发出可执行文件/ dll.在给出编译的情况下,最后一部分非常简单地完成(为清楚起见省略了一些细节):
var compilation = project.GetCompilationAsync().Result;
var compilationOptions = new CSharpCompilationOptions(outputKind,
compilation.Options.ModuleName, compilation.Options.MainTypeName,
compilation.Options.ScriptClassName, null,
compilation.Options.OptimizationLevel, compilation.Options.CheckOverflow,
false, compilation.Options.CryptoKeyContainer,
compilation.Options.CryptoKeyFile, compilation.Options.CryptoPublicKey,
compilation.Options.DelaySign, Platform.AnyCpu,
compilation.Options.GeneralDiagnosticOption,
compilation.Options.WarningLevel,
compilation.Options.SpecificDiagnosticOptions,
compilation.Options.ConcurrentBuild,
compilation.Options.XmlReferenceResolver,
compilation.Options.SourceReferenceResolver,
compilation.Options.MetadataReferenceResolver,
compilation.Options.AssemblyIdentityComparer,
compilation.Options.StrongNameProvider);
var targetCompilation = CSharpCompilation.Create(assemblyFileName,
compilation.SyntaxTrees, compilation.References,
compilationOptions);
EmitResult emitResult = null;
using (var outputFile = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
emitResult = targetCompilation.Emit(outputFile);
if (emitResult.Success)
{
return fileName;
}
}
Run Code Online (Sandbox Code Playgroud)
所以一切都运行得很好,直到我尝试编译一个项目A声明一些内部类/字段的解决方案,然后使用该[assembly: InternalsVisibleTo("...")]属性(在AssemblyInfo.cs文件中)将这些内部的可见性提供给另一个项目B.
使用visual studio直接编译工作非常精细,并允许B查看A的这些内部声明.但是,当我尝试使用Roslyn API编译我的工具时,就像InternalsVisibleTo属性被完全忽略,我收回错误, 如:
error CS0122: ... is inaccessible due to its protection …
我正在使用Roslyn CodeAnalysis API编译一个C#项目,如下面的snipet:
...
EmitResult emitResult = null;
using (FileStream outputFileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
emitResult = compilation.Emit(outputFileStream, null);
}
...
Run Code Online (Sandbox Code Playgroud)
这非常有效.但是,当我想编译包含App.Config文件的可执行项目时,此文件不会在输出目录中发出(类似于通过Visual Studio编译时的方式),如果要解析某些文件,则会出现问题在运行时从该文件配置.
我意识到它不应该默认发出,但我可能需要启用一些选项,或以某种方式从Project对象中提取App.Config路径并自己发出它?我似乎无法找到任何有关此信息,Project类似乎没有包含任何有关配置文件的信息(除非我遗漏了一些东西).
我需要使用一些特定的API来实现上述目标吗?是否有指向现有代码的指针?
非常感谢!