【问题标题】:How does the Roslyn C# compiler know where to find .NET assembly files?Roslyn C# 编译器如何知道在哪里可以找到 .NET 程序集文件?
【发布时间】:2019-09-26 14:48:01
【问题描述】:

我已使用nuget.exe 将 Roslyn 的副本下载到我计算机上的一个空目录中。然后,我在 C# 中创建了一些小测试文件来使用编译器。在我的代码中,我使用了来自 .NET Framework 的功能,例如 SqlDataReader。使用 Roslyn 附带的 csc.exe 二进制文件进行编译时,我没有手动指定任何要包含在 -reference-r 命令行选项中的 .NET 程序集,但一切仍然有效。

我在与csc.exe 相同的目录中找到了csc.rsp 文件,包括其中一些.NET 程序集。如果未指定 -noconfig 命令行选项,则会自动添加此文件中的命令行选项。部分文件如下所示:

# Reference the common Framework libraries
/r:Accessibility.dll
/r:Microsoft.CSharp.dll
/r:System.Configuration.dll
/r:System.Configuration.Install.dll
/r:System.Core.dll
/r:System.Data.dll
/r:System.Data.DataSetExtensions.dll
/r:System.Data.Linq.dll
/r:System.Data.OracleClient.dll
/r:System.Deployment.dll

我怀疑这个csc.rsp 文件是编译器能够成功编译我的代码的原因,即使我没有手动包含任何.NET 程序集。不过,我的问题是,csc.exe 是如何知道在哪里查找这些文件的?

我用 VSCode 搜索了整个 Roslyn 目录,寻找任何可能的配置,指定搜索程序集的路径,但没有发现任何问题。我还检查了我的系统路径变量的目录,它可能会自动从中获取文件,但我也找不到任何东西。 csc.exe 是如何包含这些文件的,即使我没有告诉它在我的计算机上哪里可以找到它们?

【问题讨论】:

    标签: .net roslyn csc


    【解决方案1】:

    即使我没有告诉 csc.exe 在我的计算机上何处查找它们,csc.exe 如何包含这些文件?

    它运行的代码会在它期望的位置查找文件。 .NET 框架代码的默认位置可由编译器发现。如果你想知道确切的细节,请阅读编译器的源代码。

    您要查看的类是从 MetadataReferenceResolver 派生的任何内容。见

    https://github.com/dotnet/roslyn/search?q=MetadataReferenceResolver

    对于命令行编译器,您特别想查看LoggingMetadataFileReferenceResolver,它将大部分工作委托给RelativePathResolver

    【讨论】:

    • 我可以手动告诉编译器在哪里寻找程序集吗?
    • @AaronBeaudoin:是的。如果这是你的问题,这就是你应该问的问题。试着问你真正想要回答的问题;这样可以避免试图回答您问题的人浪费时间。
    • 这根本不是我最初的问题,但在阅读了您的回复后,我认为这是合乎逻辑的跟进,不是吗?我应该创建一个新问题吗?
    • @AaronBeaudoin:不。在您对 StackOverflow 提出任何问题之前,您应该始终进行基础研究。如果您想知道如何告诉编译器在哪里查找程序集,请阅读编译器文档。从csc /? 开始,读取编译器的所有选项。或者,如果您使用的是 Visual Studio,请查看项目属性窗格。
    【解决方案2】:

    这些程序集位于Global Assembly Cache

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多