在PowerShell中使用引用的DLL运行C#代码

时间:2019-03-24 13:36:23

标签: c# .net powershell dll

我知道如何在PowerShell中运行C#代码。
但是在我的C#代码中,我想使用引用的DLL(特别是NtApiDotNet)。
我在Visual Studio中将其与NuGet一起安装,并且可以正常工作,因为所引用的DLL是由Visual Studio引用的。
当我在PowerShell中使用代码时,看不到用于引用C#代码到此DLL的选项。
我尝试使用[Reflection.Assembly]::LoadFile("c:\path\file.dll") | Out-Null加载DLL,但需要将其加载到C#代码中,因此对我没有帮助。

我也试图像这样加载它:

Add-Type -Path "C:\Users\myuser\Downloads\NtApiDotNet.dll"

但是没有用。

这是powershell代码:

$code = @"
using System;
using NtApiDotNet;

namespace ConsoleApplication2
{
    public class Program
    {
        public static void Main()
        {
            NtSection section = null;
            Console.WriteLine("C# code from PowerShell");
        }
    }
}
"@

$location = [PsObject].Assembly.Location
$compileParams = New-Object System.CodeDom.Compiler.CompilerParameters
$assemblyRange = @("System.dll", $location)
$compileParams.ReferencedAssemblies.AddRange($assemblyRange)
$compileParams.GenerateInMemory = $True
Add-Type -TypeDefinition $code -CompilerParameters $compileParams -passthru | Out-Null
[ConsoleApplication2.Program]::Main()

因为我没有引用DLL,所以出现以下错误:

Add-Type : c:\Users\myuser\AppData\Local\Temp\s1fssauz.0.cs(2) : The type or namespace name 'NtApiDotNet' could not
be found (are you missing a using directive or an assembly reference?)
c:\Users\myuser\AppData\Local\Temp\s1fssauz.0.cs(1) : using System;
c:\Users\myuser\AppData\Local\Temp\s1fssauz.0.cs(2) : >>> using NtApiDotNet;
c:\Users\myuser\AppData\Local\Temp\s1fssauz.0.cs(3) :
At line:24 char:1
+ Add-Type -TypeDefinition $code -CompilerParameters $compileParams -pa ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (Microsoft.Power...peCompilerError:AddTypeCompilerError) [Add-Type], Except
   ion
    + FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand

Add-Type : Cannot add type. Compilation errors occurred.
At line:24 char:1
+ Add-Type -TypeDefinition $code -CompilerParameters $compileParams -pa ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Add-Type], InvalidOperationException
    + FullyQualifiedErrorId : COMPILER_ERRORS,Microsoft.PowerShell.Commands.AddTypeCommand

Unable to find type [ConsoleApplication2.Program].
At line:25 char:1
+ [ConsoleApplication2.Program]::Main()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (ConsoleApplication2.Program:TypeName) [], RuntimeException

如何引用DLL,以便能够使用引用的DLL NtApiDotNet

可以找到与我类似的问题here

2 个答案:

答案 0 :(得分:1)

我只需要将DLL添加到do { System.out.println("Select operation (1-5): "); choice = -1; if (!sc.hasNextInt()) { System.out.println("Please enter a number (1-5, inclusive)"); } else { choice = sc.nextInt(); if (choice < 1 || choice > 5) { System.out.println(choice + " isn't an option, please enter a number (1-5, inclusive"); } } sc.nextLine(); } while (choice < 1 || choice > 5); switch (choice) { // ...
这是固定线:

ReferencedAssemblies

我使用了releases中的$assemblyRange = @("System.dll", $location, "C:\Users\myuser\Downloads\NtApiDotNet.dll")
当我根据自述文件进行编译时:

NtApiDotNet.dll

DLL无法正常工作。

答案 1 :(得分:1)

我也遇到了这个问题,但是幸运的是我解决了。要解决此问题,您需要使用 Install-Module "NtObjectManager" -Scope CurrentUser安装NtObjectManager模块。 如果这不起作用,请确保已导入NtObjectManager。