Powershell Add-Type在编译.dll时禁止创建.pdb(C#)

时间:2014-01-04 07:55:45

标签: c# powershell dll powershell-v2.0 pdb-files

我正在创建一个C#hello world DLL并使用内置的PowerShell Add-Type命令对其进行编译。执行此操作时,它会在.dll。

目录中创建一个不需要的.pdb调试文件

使用Add-Type命令时,如何禁止创建此.pdb文件。我知道在Visual Studio中我们可以通过一个选项禁用它,但似乎找不到合适的cmd行语法。

以下是PowerShell示例代码。从控制台运行,它将在C:\上创建DLL以及.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 个答案:

答案 0 :(得分:6)

当C#编译器在调试模式下编译.NET程序集时输出PDB文件。我不知道为什么Add-Type默认会使用调试行为进行编译,因为这不是我自己注意到的。但是,如果要显式禁止此行为,可以将指定编译器选项,特别是/debug-(请注意末尾的减号)指定给C#编译器。

为了指定编译器选项,您必须实例化System.CodeDom.Compiler.CompilerParameters .NET类,在其上指定OutputAssemblyCompilerOptions属性,然后传递CompilerParameters将对象放入-CompilerParameters cmdlet的Add-Type参数中。

以下是/debug compiler parameter上的MSDN文档以及CompilerParameters .NET class的文档。

注意:您不能在-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;

答案 1 :(得分:0)

这可能是由环境变量中设置的编译器选项引起的,因为您已使用SDK CMD shell打开了提示。它将标准选项加载到环境变量中。

如果这是原因,只需清除PowerShell中的变量即可 $ ENV:compiler_options =''

这不会影响shell的会话。