【发布时间】:2016-09-20 16:17:03
【问题描述】:
我正在使用 CSharpCodeProvider 自己编译带有可变参数的 .exe。编译工作正常(不返回错误)并且成功但是在运行时它开始并立即退出而没有任何错误或输出。 当更改“Main”(例如改为私有或重命名)时,编译器输出没有有效的 Main 方法,因此示例代码不应该是原因。
有人对此有答案/解决方案吗?我对这个很迷茫,如果有任何有用的回应,我将不胜感激。 先谢谢了~
*编辑:
编译后的 .exe 输出:http://imgur.com/a/WBvz3
编译器:
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Resources;
using System.Security.Cryptography;
using System.Text;
using Microsoft.CSharp;
using Packer.Properties;
namespace Packer
{
internal class Program
{
private static void Main(string[] args)
{
Console.WriteLine("Sample Compiler");
Console.WriteLine(".ico-path: ");
var icon = "E:\\sample.ico"; //Console.ReadLine();
Console.WriteLine("> " + icon);
Console.WriteLine("Target-exe: ");
var target = "E:\\sample.exe"; //Console.ReadLine();
Console.WriteLine("> " + target);
var source = Resources.samplesource;
// Compile with all params
var success = CompileFromSource(source, target, icon);
// Determine result
Console.WriteLine(success ? "Successfully compiled." : "Compiling error.");
if (success) Process.Start(target);
Console.ReadLine();
}
private static bool CompileFromSource(string source, string output,
string icon = null, string[] resources = null)
{
var cParams = new CompilerParameters
{
GenerateInMemory = true,
WarningLevel = 0,
GenerateExecutable = true,
OutputAssembly = output
};
var options = "/optimize+ /platform:x86 /target:winexe /unsafe";
if (icon != null)
options += " /win32icon:\"" + icon + "\"";
// Set the options.
cParams.CompilerOptions = options;
cParams.TreatWarningsAsErrors = false;
cParams.ReferencedAssemblies.Add("System.dll");
cParams.ReferencedAssemblies.Add("System.Core.dll");
cParams.ReferencedAssemblies.Add("System.Data.dll");
// Check if the user specified any resource files. & Add them
if (resources != null && resources.Length > 0)
{
// Loop through all resource files specified in the Resources[] array.
foreach (var res in resources)
{
// Add each resource file to the compiled stub.
cParams.EmbeddedResources.Add(res);
}
}
// Dictionary variable is used to tell the compiler what we want
var providerOptions = new Dictionary<string, string> {{"CompilerVersion", "v4.0"}};
var results = new CSharpCodeProvider(providerOptions).CompileAssemblyFromSource(cParams, source);
// Check if any errors occured while compiling.
if (results.Errors.Count <= 0) return true;
Console.WriteLine("The compiler has encountered {0} errors", results.Errors.Count);
foreach (CompilerError err in results.Errors)
{
Console.WriteLine("{0}\nLine: {1} - Column: {2}\nFile: {3}", err.ErrorText, err.Line, err.Column,
err.FileName);
}
return false;
}
}
}
要编译的代码:
using System;
using System.Text;
namespace CC2Runner
{
public static class Program
{
public static void Main(string[] args)
{
try
{
Debug.WriteLine("Sample Starting...");
Console.WriteLine("Sample Starting...");
...
}
catch (Exception e)
{
Console.WriteLine(e);
}
Console.ReadLine();
}
}
}
【问题讨论】:
-
你检查过事件日志吗?
-
不,执行程序(然后立即退出)是否会在事件日志中记录任何内容?
-
使用
ILDasm,并与包含相同代码的“真实”程序进行比较,你能发现任何差异吗? -
只需添加 /pdb 选项即可调试生成的程序。
-
"/target:winexe"?那么一个WinForms程序呢?请改用
/target:exe。
标签: c# codedom csharpcodeprovider