c# - 通过 Roslyn 编译解决方案时忽略 InternalsVisibleTo 属性

标签 c# roslyn

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

所以一切都很好,直到我尝试编译一个解决方案,其中项目 A 声明了一些内部类/字段,然后使用 [assembly: InternalsVisibleTo("...")]属性(在 AssemblyInfo.cs 文件中)以向另一个项目 B 提供这些内部结构的可见性。

使用 Visual Studio 直接编译工作得很好,并允许 B 看到 A 的这些内部声明。 但是,当我尝试使用 Roslyn API 通过我的工具进行编译时,就像 InternalsVisibleTo 属性被完全忽略一样,我收到了错误, 如:
error CS0122: ... is inaccessible due to its protection level
这意味着 InternalsVisibleTo 没有被选中。

我原以为 Roslyn 会自动从解析的项目信息中提取它,但我现在想知道是否必须启用某些特定的编译选项或手动添加一些信息?

我环顾四周,但找不到类似的问题或答案,除非我遗漏了一些东西。如果需要,我可以提供更多信息。谢谢!

最佳答案

InternalsVisibleTo需要与用于对另一个程序集进行签名的公钥完全匹配(或者在未签名的程序集的情况下不需要公钥)。
仔细检查您是否提供了正确的 key 和正确的程序集名称,包括命名空间。
特别是,在这里,您对完整的公钥感兴趣,而不是公钥 token 。
有关更多信息以及如何为此目的提取公钥,请查看 InternalsVisibleToAttribute Class .

关于c# - 通过 Roslyn 编译解决方案时忽略 InternalsVisibleTo 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31167861/

相关文章:

c# - C#中的选择

c# - 无法加载规则程序集

c# - 查找 ISymbol 的 SyntaxNode

c# - 为什么 C# 和 C++ 使用 _<variableName> 编码约定?

c# - 将 Model 绑定(bind)到 ViewModel 的方法

c# - 以编程方式计算 DOCX 文档中具有特定样式的字符/单词/段落的数量

c# - Roslyn:分析调用方法的对象

c# - 为 Roslyn SyntaxFactory 指定语言版本

c# - Roslyn - 从 yield'ed IEnumerable<T> 创建一个 SeparatedList<T>

c# - 退出我的 Entity Framework ObjectContext 之一的分布式事务