#c# #variables #csharpcodeprovider
#c# #переменные #csharpcodeprovider
Вопрос:
Мне нужно создать EXE-файл с моим приложением, я могу передавать строки, манипулируя строковым форматом, но я не могу передать другие переменные, которые мне нужны, например: массив байтов, вот мой код, если это поможет:
using Microsoft.CSharp;
using System;
using System.CodeDom.Compiler;
using System.Windows;
namespace ACompiler.CompWorker
{
class CompilerWorker
{
public static byte[] testarray = SomeClass.SomeArray;
public static string Key = "Testkey12";
public static void Compile()
{
CSharpCodeProvider CompileProvider = new CSharpCodeProvider();
CompilerParameters CompileProviderParameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll" }, AppDomain.CurrentDomain.BaseDirectory "Compiled.exe", true);
CompileProviderParameters.GenerateExecutable = true;
string test= @"using System;
namespace Tests
{
class Program
{
static void Main(string[] args)
{
byte[] Content = " testarray @";
string Key = """ Key @""";
Console.WriteLine(""Key: "" EKey);
Console.WriteLine(Content);
Console.ReadLine();
}
}
}
";
var Result = CompileProvider.CompileAssemblyFromSource(CompileProviderParameters, test);
}
}
}
В принципе, я хочу переместить «testarray» в скомпилированное приложение, я надеюсь, что кто-нибудь сможет указать мне правильное направление!
Ответ №1:
Хитрость заключается в том, чтобы «сериализовать» данные обратно в код, который может скомпилировать компилятор. Попробуйте это:
var arrayCode = "new byte[] { " string.Join(", ", testarray) " }";
string test = @"using System;
namespace Tests
{
class Program
{
static void Main(string[] args)
{
byte[] Content = " arrayCode @";
string Key = """ Key @""";
Console.WriteLine(""Key: "" EKey);
foreach(byte b in Content)
{
Console.WriteLine(b.ToString());
}
Console.ReadLine();
}
}
}
";
Имейте в виду, вы не можете сделать Console.WriteLine
с объектом массива байтов и заставить его выдавать каждый элемент. Вам придется перебирать элементы, чтобы распечатать их. Я обновил ваш код, чтобы сделать это надлежащим образом.
Комментарии:
1. Это работает, но если массив слишком велик, то моя программа зависает…
2. Неважно, у меня было окно сообщения, в котором отображалась строка «test», и в конечном итоге она была бы слишком большой для отображения.. Ха-ха