2014-06-24 1 views
0

상대 경로를 가진 dll을 powershell로 가져 오려고합니다. 다음은 dll을 가져 오려고하는 코드 조각입니다.상대 경로를 사용하여 C 스타일 32 비트 API에 액세스하기위한 powershell의 DLLImport

$dirpath = split-path $MyInvocation.MyCommand.Definition 
$testDllPath = "$dirpath\..\Test1\Test.dll" 
$signatureGet = @' 
[DllImport(@"$testDllPath",EntryPoint="TestMethod",ExactSpelling=false)] 
public static extern bool TestMethod([MarshalAs(UnmanagedType.LPWStr)]string args1, [MarshalAs(UnmanagedType.LPWStr)]string args2); 
'@ 

$typeFunc = Add-Type -MemberDefinition $signatureGet -Name "TestMethod" -PassThru 

$ret = $typeFunc::TestMethod($args1, $args2) 

하드 코딩 된 경로로 동일한 작업을 시도하면 DLL이로드 될 수 있습니다. 상대 경로와 동일하게 작동하지 않습니다. 잘못된 형식으로 인해 오류가 발생합니다.

이 작업을 수행하는 방법을 알려주십시오.

답변

1

PowerShell에서 현재 경로를 사용하여 상대 경로를 사용하면 Windows와 상호 작용할 때 위험합니다. 언젠가 이것을 실행하십시오 :

[environment]::CurrentDirectory 

PowerShell의 현재 디렉토리 개념이 항상 현재 디렉토리의 Windows 개념과 일치하는 것은 아닙니다. 이는 동일한 PowerShell 프로세스에서 동시에 여러 스크립트를 실행할 수 있고 필요에 따라 현재 디렉터리를 각각 변경할 수 있기 때문입니다. 게다가 나는 DllImportAttribute가 상대 경로를 받아 들일 것이라고 생각하지 않는다. 일반적으로 이름 만 입력하면 Windows는 exe (PowerShell.exe)와 동일한 디렉터리를 검색 한 다음 PATH 환경 변수의 경로를 검색합니다. PATH의 ENV var에 당신이 dll을 예를 가져 오는 스크립트를 호출을 시도하기 직전 :

가 $의 ENV를 수정 할 수있는 일이다

$dirpath = split-path $MyInvocation.MyCommand.Definition 
$env:PATH += ";$dirpath\..\..\Test1" 
$signatureGet = @' 
[DllImport(@"Test.dll",EntryPoint="TestMethod",ExactSpelling=false)] 
    public static extern bool TestMethod([MarshalAs(UnmanagedType.LPWStr)]string args1, [MarshalAs(UnmanagedType.LPWStr)]string args2); 
'@ 

$typeFunc = Add-Type -MemberDefinition $signatureGet -Name "TestMethod" -PassThru 
$ret = $typeFunc::TestMethod($args1, $args2) 
+0

답변과 명확한 설명에 감사드립니다. 그것은 작동합니다 :-) –

0

당신은 64 비트 OS (세븐를 사용하는 또 다른 이유는, Windows 8 ...)

PowerShell 명령 줄을 실행하거나 PowerShell을 명령 줄에서 실행하면 기본적으로 64 비트 PowerShell을 실행하므로이 cas에서는 64 비트 프로세스로 32 비트 DLL을로드 할 수 없습니다. (사람 @ ""@에서만) @ ''@ 변수로 확장되지 않습니다

사실
%SystemRoot%\syswow64\WindowsPowerShell\v1.0\powershell.exe 
+0

답변 주셔서 감사합니다. PowerShell은 지정된 32 비트 exe 경로 자체에서 실행됩니다. –

0

문자열을, 그래서 DLL 경로가되지 않습니다 :이 경우

는 3E 비트 PowerShell을 사용하여 스크립트를 실행하려고 변수 참조가 지정되면 해결됩니다.

관련 문제