Roslyn C#编译器如何知道在哪里找到.NET程序集文件?

问题描述 投票:-1回答:1

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

我在与csc.rsp相同的目录中找到了csc.exe文件,其中包括一些.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个回答
0
投票

即使我没有告诉csc.exe在我的计算机上的位置,这些文件也如何包含这些文件?

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

您要查看的类是从MetadataReferenceResolver派生的任何东西。见

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

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

© www.soinside.com 2019 - 2024. All rights reserved.