C# 从Powershell调用的DLL使用相对于Powershell安装目录的路径。我怎么能把它设成别的?

C# 从Powershell调用的DLL使用相对于Powershell安装目录的路径。我怎么能把它设成别的?,c#,windows,powershell,dll,log4net,C#,Windows,Powershell,Dll,Log4net,我有一个带有静态方法的DLL,我正在从Powershell脚本调用它 此静态方法使用与网站共享的log4net配置执行某些任务并记录结果-log4net配置基于web.config文件,Powershell脚本使用此web.config文件,如下所示: [System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $webconfigpath) 这非常有效,log4net成功地获取了配置,如下所示: <log4net>

我有一个带有静态方法的DLL,我正在从Powershell脚本调用它

此静态方法使用与网站共享的log4net配置执行某些任务并记录结果-log4net配置基于web.config文件,Powershell脚本使用此web.config文件,如下所示:

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $webconfigpath)
这非常有效,log4net成功地获取了配置,如下所示:

<log4net>
  <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="App_Data/log/process.log" />
    <appendToFile value="true" />
    [..]
  </appender>
  <root>
    <level value="DEBUG" />
    <appender-ref ref="RollingFile" />
  </root>
</log4net>

如何为DLL代码提供一个用作相对基的路径?

我们为不同环境解决这个问题的方法是使用环境变量。每个开发人员都有自己的想法,他们想在哪里记录东西,prod环境有另一组位置

在您的特定情况下,您的PowerShell中可以有以下环境变量:

$env:MyLogs=“$webroot\”
#或[Environment]::SetEnvironmentVariable(“MyLogs”,“$webroot\”)
并将记录器设置为这样():



如果不仅仅是log4net需要变量,他们应该有自己的获取环境变量的方法。

Hi@r41n,我可以加载DLL并调用其中的代码,这不是问题所在。问题是log4net的配置使用了日志文件的相对路径,但它是基于Powershell安装目录中的相对路径,而不是运行脚本的位置。很抱歉,似乎完全搞错了。删除我无用的评论。如果我正确理解这个问题,我会说这是预期行为。DLL的代码在执行调用处理的目录中执行。使用cd(又名.Set Location)不会更改启动powershell.exe的目录,只有目录powershell在中运行。您可以尝试运行Powershell并使用以下示例行启动另一个Powershell实例
启动进程-FilePath Powershell.exe-WorkingDirectory c:\temp
,并将“c:\temp”替换为所需的目录,在这种情况下,脚本可能能够找到您的配置文件。我能想到的唯一其他选项是动态更改DLL并使其接受包含配置文件目录的参数。实际上,上面所述的Start Process cmdlet语法会引发错误。下面应该可以做到这一点:`Start Process powershell.exe-Verb RunAs-WorkingDirectory C:`(它需要提升的权限)。我仍然认为最好的办法是调整DLL的代码以接受参数。
$webroot = "$PSScriptRoot\..\webdir";
$webconfig = "$webroot\web.config";

# Neither of these seem to set the working directory for the DLL
#Set-Location $webroot
#[Environment]::CurrentDirectory = $webroot

[void][System.Reflection.Assembly]::LoadWithPartialName("System.Configuration")
[void][System.Reflection.Assembly]::LoadFrom("$webroot\bin\Custom.Code.dll")

if (!(Test-Path $webconfig)) {
    Throw "Aborting, could not locate web.config at $webconfig";
}

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", $webconfig)

$result = [Custom.Code.Task]::Execute()

Write-Host $result
<file value="${MyLogs}App_Data/log/process.log" />