小编pde*_*gia的帖子

通过Roslyn编译解决方案时,InternalsVisibleTo属性被忽略

所以我正在开发一个基于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 …

c# roslyn

8
推荐指数
1
解决办法
268
查看次数

使用CodeAnalysis.Compilation.Emit进行编译时复制App.config

我正在使用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来实现上述目标吗?是否有指向现有代码的指针?

非常感谢!

c# roslyn

2
推荐指数
1
解决办法
79
查看次数

标签 统计

c# ×2

roslyn ×2