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