我正在创建一个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!
答案 0 :(得分:6)
当C#编译器在调试模式下编译.NET程序集时输出PDB文件。我不知道为什么Add-Type
默认会使用调试行为进行编译,因为这不是我自己注意到的。但是,如果要显式禁止此行为,可以将指定编译器选项,特别是/debug-
(请注意末尾的减号)指定给C#编译器。
为了指定编译器选项,您必须实例化System.CodeDom.Compiler.CompilerParameters
.NET类,在其上指定OutputAssembly
和CompilerOptions
属性,然后传递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的会话。