如何在linux上用.Net Core获取当前执行目录?

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

我需要加载一个XML模式文件,以验证一些信息在一个 .Net Core 2.1 api,在linux服务器上。 不幸的是,我无法访问这台服务器(我们使用jenkins来部署,所以我与它没有任何联系),所以我只能在我的电脑上测试,这台电脑是Windows 10。我已经尝试了以下方法。

System.AppContext.BaseDirectory
System.AppContext.BaseDirectory.Substring(0, AppContext.BaseDirectory.IndexOf("bin"));
AppDomain.CurrentDomain.BaseDirectory
Directory.GetCurrentDirectory()
GetType().Assembly.Location
System.Reflection.Assembly.GetExecutingAssembly().Location
System.Reflection.Assembly.GetExecutingAssembly().CodeBase

所有这些都会返回当前在Windows上的执行位置(即... ... C:/SomePath/SomeProject/Name/api.dll),我可以用 Path.Combine 来生成模式文件的路径。

然而,在linux上,这些都返回 /home/app/ 根据Jenkins日志,dll不应该在那里。 这导致了加载模式文件的失败。 该项目实际上位于 /services/projectname/.

测试代码。

var schema = new XmlSchemaSet { XmlResolver = new XmlUrlResolver() };
schema.Add(null, Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Schema/schema.xsd"));

预期。在Windows和Linux上,它使用.dll执行路径作为基础来加载模式文件。

实际:在Linux上,我得到 home/app 而不是正确的路径。

编辑:我不能硬编码路径。 路径在每次部署时都会改变,因为项目名称是有版本的。 这意味着在我部署它的时候,任何硬编码的值都是不正确的。 我绝对需要一个相对路径。 除了这个技术要求之外,硬编码是一个大忌。 我永远不会让它通过代码审查。

c# linux asp.net-core asp.net-core-2.1
1个回答
0
投票

对我来说,在dotnet core 3.1中,下面的语句在Windows和Ubuntu的控制台应用程序中都可以使用。

Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
© www.soinside.com 2019 - 2024. All rights reserved.