Тип добавления Powershell подавляет создание.pdb при компиляции.dll (C#)

Я создаю C# hello world DLL и собираю ее с помощью встроенной команды powershell Add-Type. При этом он создает нежелательный файл отладки.pdb в каталоге с.dll.

Как подавить создание этого файла.pdb при использовании команды Add-Type. Я знаю, что в Visual Studio мы можем отключить это с помощью параметра, но не могу найти правильный синтаксис строки cmd.

Вот пример кода powershell. Запустите из консоли, и он создаст DLL на C:\ вместе с.pdb

Clear-Host

Add-Type -OutputAssembly C:\Knuckle.dll @"

using System;

namespace Knuckle
{

    public class Dragger
    {

                public static void Main()
        {   
        Console.WriteLine("Knuckle-Dragger was Here!");
        }

    }
}

"@

[Void][Reflection.Assembly]::LoadFile("C:\Knuckle.dll")  

[Knuckle.Dragger]::Main()

Результат

PS C:\Users\Knuckle-Dragger> [Knuckle.Dragger]::Main()
Knuckle-Dragger was Here!

2 ответа

Решение

Файлы PDB выводятся, когда компилятор C# компилирует сборку.NET в режиме отладки. Я не знаю почему Add-Type будет компилироваться с отладочным поведением по умолчанию, так как это не то, что я сам заметил. Однако, если вы хотите явно подавить это поведение, вы можете указать параметры компилятора, в частности /debug- (обратите внимание на знак минус в конце), для компилятора C#.

Чтобы указать параметры компилятора, вы должны создать экземпляр System.CodeDom.Compiler.CompilerParameters.NET класс, укажите OutputAssembly а также CompilerOptions свойства, а затем передать CompilerParameters возражать в -CompilerParameters параметр Add-Type Командлет.

Вот документация MSDN по /debug параметр компилятора и документация для CompilerParameters .NET класс.

Примечание: вы не можете использовать -OutputAssembly параметр на Add-Type рядом с -CompilerParameters параметр. Поэтому вам нужно будет указать OutputAssembly собственность на CompilerParameters объект, как обсуждалось ранее. Пример кода ниже показывает, как это сделать.

mkdir -Path c:\test;
$Code = @"
using System;

namespace test { };
"@

# 1. Create the compiler parameters
$CompilerParameters = New-Object -TypeName System.CodeDom.Compiler.CompilerParameters;
# 2. Set the compiler options
$CompilerParameters.CompilerOptions = '/debug-';
# 3. Set the output assembly path
$CompilerParameters.OutputAssembly = 'c:\test\Knuckle.dll';
# 4. Call Add-Type, and specify the -CompilerParameters parameter
Add-Type -CompilerParameters $CompilerParameters -TypeDefinition $Code;

Вероятно, это вызвано параметрами компилятора, установленными в переменной среды, поскольку вы открыли приглашение с помощью оболочки SDK CMD. Он загружает стандартные параметры в переменную окружения.

Если это причина, просто очистите переменную в PowerShell $env:compiler_options=''

Это не повлияет на оболочку только на сеанс.

Другие вопросы по тегам