Выполнение кода на C # со ссылочной DLL в PowerShell - PullRequest
1 голос
/ 24 марта 2019

Я знаю, как запустить код C # в PowerShell.
Но в моем коде C# я хочу использовать библиотеку DLL, на которую ссылаются (в частности, NtApiDotNet ).
Я установил его с NuGet в Visual Studio, и он отлично работает, потому что Visual Studio ссылается на DLL, на которую ссылаются.
Когда я использую код внутри PowerShell, я не вижу опции для ссылки кода C# на эту DLL.
Я пытался загрузить DLL с помощью [Reflection.Assembly]::LoadFile("c:\path\file.dll") | Out-Null, но ее нужно загрузить внутри кода 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?

Проблему, похожую на мою, можно найти здесь .

1 Ответ

1 голос
/ 24 марта 2019

Мне просто нужно было добавить DLL в ReferencedAssemblies.
Это фиксированная линия:

$assemblyRange = @("System.dll", $location, "C:\Users\myuser\Downloads\NtApiDotNet.dll")  

Я использовал NtApiDotNet.dll из релизов .
Когда я скомпилировал его в соответствии с файлом readme:

dotnet build NtApiDotNet\NtApiDotNet.Core.csproj -c Release

DLL не работает правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...