Как передать переменную с помощью CSharpCodeProvider?

#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», и в конечном итоге она была бы слишком большой для отображения.. Ха-ха