C# 从Powershell调用的DLL中的当前目录错误

C# 从Powershell调用的DLL中的当前目录错误,c#,powershell,dll,C#,Powershell,Dll,我有一个带有静态方法的DLL,希望知道当前目录。我加载图书馆 c:\temp> add-type -path "..." …并调用该方法 c:\temp> [MyNamespace.MyClass]::MyMethod() 但是Directory.GetCurrentDirectory和.Environment.CurrentDirectory都错误地获取了当前目录 正确的方法是什么?powershell中有两个可能的目录。一个是进程的当前目录,可通过Environment.Cu

我有一个带有静态方法的DLL,希望知道当前目录。我加载图书馆

c:\temp> add-type -path "..."
…并调用该方法

c:\temp> [MyNamespace.MyClass]::MyMethod()
但是Directory.GetCurrentDirectory和.Environment.CurrentDirectory都错误地获取了当前目录


正确的方法是什么?

powershell中有两个可能的目录。一个是进程的当前目录,可通过Environment.CurrentDirectory或directory.GetCurrentDirectory访问。另一个目录是当前Powershell提供程序中的当前位置。这是您在命令行中看到的内容,可通过get-location cmdlet获得。使用set-location alias cd时,您正在更改此内部路径,而不是进程的当前目录

如果希望某个.NET库使用进程的当前目录获取当前位置,则需要显式设置它:

[Environment]::CurrentDirectory = get-location

Powershell有一个可扩展的模型,允许像文件系统中的驱动器一样装载不同的数据源。文件系统只是众多提供者之一。您可以通过get-psprovider查看其他提供商。例如,注册表提供程序允许像文件系统一样导航Windows注册表。另一个函数允许您通过dir函数查看所有函数:。

如果DLL中的命令继承自System.Management.Automation.PSCmdLet,则当前PS位置在SessionState.Path中可用

公共类SomeCommand:PSCmdlet { 受保护的覆盖void BeginProcessing { 字符串currentDir=this.SessionState.Path.CurrentLocation.Path; } } 要在没有会话引用的情况下访问路径,此代码似乎可以工作。这个解决方案是我在阅读了使GIT自动完成的代码之后发现的,具体来说

公开课考试 { 公共静态IEnumerable GetPath { 使用var ps=PowerShell.CreateRunspaceMode.CurrentRunspace { ps.AddScriptpwd; var path=ps.Invoke; 返回路径。选择p=>p.path; } } } 输出:

PS C:\some\folder> [Test]::GetPath()
C:\some\folder

你要什么目录?错误还是输出?还有你在做什么的示例代码?C从何而来?我有点不对劲here@AthomSfere,嗯,奇怪的是,我在编译DLL时得到了项目的目录@另外,哦,我的DLL是用c写的,我正在做的调用是用c写的-也许这不相关,但我想我会把它扔进去,这是我不明白的,Mike,如果我从给定的目录启动Powershell,我会认为那是我的DLL将看到的当前目录。换句话说,为什么环境变量除了get location返回的值之外还有其他值?我的第二个问题是,如何从我的DLL访问Powershell提供程序中当前的另一个目录?有什么原因我不想这样做吗?@ekkis通常,是的,在给定目录中启动Powershell将使该目录成为Powershell进程的当前目录。您没有很清楚地描述您所做的工作,因此我们不知道您是否更改了路径或执行了可能已更改的脚本。@ekkis AFAIK无法在DLL中获取当前powershell上下文。您可以显式设置当前目录,也可以通过参数或静态属性在DLL中公开要使用的目录。这太荒谬了。但也许这只是我的观点,因为我已经习惯了Linux的操作方式。