Powershell添加类型在编译.dll(C#)时禁止创建.pdb

Powershell添加类型在编译.dll(C#)时禁止创建.pdb,c#,powershell,dll,powershell-2.0,pdb-files,C#,Powershell,Dll,Powershell 2.0,Pdb Files,我正在创建一个C#hello world DLL,并使用内置的powershell Add Type命令对其进行编译。执行此操作时,它会在目录中创建一个不需要的.pdb调试文件和.dll 如何在使用Add Type命令时禁止创建此.pdb文件。我知道在VisualStudio中,我们可以通过一个选项禁用它,但似乎找不到正确的cmd行语法 下面是示例powershell代码。从控制台运行,它将在C:\和.pdb上创建DLL Clear-Host Add-Type -OutputAssembly

我正在创建一个C#hello world DLL,并使用内置的powershell Add Type命令对其进行编译。执行此操作时,它会在目录中创建一个不需要的.pdb调试文件和.dll

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

下面是示例powershell代码。从控制台运行,它将在C:\和.pdb上创建DLL

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!

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

要指定编译器选项,必须实例化
System.CodeDom.compiler.CompilerParameters
.NET类,在其上指定
OutputAssembly
CompilerOptions
属性,然后将
CompilerParameters
对象传递到
Add-Type
cmdlet的
-CompilerParameters
参数中

以下是的MSDN文档,以及的文档

注意:不能在
添加类型
上使用
-outputasembly
参数和
-CompilerParameters
参数。因此,您需要在
CompilerParameters
对象上指定
OutputAssembly
属性,如前所述。下面的示例代码说明了如何执行此操作

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;

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

要指定编译器选项,必须实例化
System.CodeDom.compiler.CompilerParameters
.NET类,在其上指定
OutputAssembly
CompilerOptions
属性,然后将
CompilerParameters
对象传递到
Add-Type
cmdlet的
-CompilerParameters
参数中

以下是的MSDN文档,以及的文档

注意:不能在
添加类型
上使用
-outputasembly
参数和
-CompilerParameters
参数。因此,您需要在
CompilerParameters
对象上指定
OutputAssembly
属性,如前所述。下面的示例代码说明了如何执行此操作

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 shell打开提示符。它将标准选项加载到环境变量中

如果这是原因,请清除PowerShell中的变量 $env:compiler_options=''


这不会影响shell,只会影响会话。

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

如果这是原因,请清除PowerShell中的变量 $env:compiler_options=''


这不会影响shell,只会影响会话。

我不认为cmdlet中有一种内置方式可以跳过pdb文件,但老实说。。添加
删除项目C:\Knuckle.dll-Force
有那么难吗?老实说,我认为cmdlet中没有一种内置方法可以跳过pdb文件。。添加
删除项目C:\knockle.dll-Force
有这么难吗?