2012-05-19 2 views
1

Предположим, что какой-то программист вручил мне скомпилированную программу без исходного кода, которая делает некоторые вещи, но не имеет графического представления о том, что она делает. Однако он предоставляет возможность легко добавить это. Но как программист позволит людям взаимодействовать с вещами в скомпилированной программе?Позволяет людям модерировать программу

Эта демонстрационная программа просто делает случайное число с максимальным значением, а затем запускает событие, которое должно раскрывать, что произошло с людьми, которые хотят использовать эти данные в своих собственных моделях для программы.

public delegate void MadeRandomEventHandler(int previous,int current,int max); 

class MakeRandom 
{ 
    private static int current = 350; 
    private static int max = 350; 

    public static event MadeRandomEventHandler MadeRandomEvent; 
    public static void dowork() 
    { 
     int curCopy = current; 
     Random random = new Random(); 
     current = random.Next(0, max+1); 
     fireMadeRandomEvent(curCopy,current,max); 
    } 

    private static void fireMadeRandomEvent(int previous, int current, int max) 
    { 
     if (MadeRandomEvent != null) 
      MadeRandomEvent(previous,current,max); 
    } 
} 

И, конечно, форма с кнопкой для вызова DoWork()

public partial class Form_Main : Form 
{ 
    public Form_Main() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     MakeRandom.dowork(); 
    } 
} 

Так что теперь все, что я должен был бы сделать, чтобы создать мод, который показывает мне, что случилось, это создать новую форму с индикатором прогресса и обработкой события, которое запускает класс MakeRandom.

Форма:

public partial class Form_Mod : Form 
{ 
    public static Form_Mod frm; 

    public Form_Mod() 
    { 
     InitializeComponent(); 
    } 

    private void Form_Mod_Load(object sender, EventArgs e) 
    { 
     frm = this; 
     progressBar1.Minimum = 0; 
     progressBar1.Maximum = 100; 
    } 

    public void updateProgress(int percent) 
    { 
     progressBar1.Value = percent; 
    } 
} 

И обработка событий:

class Mod_HandleEvents 
{ 
    public static void attach() 
    { 
     MakeRandom.MadeRandomEvent += new MadeRandomEventHandler(RandomChange); 
    } 
    public static void detach() 
    { 
     MakeRandom.MadeRandomEvent -= new MadeRandomEventHandler(RandomChange); 
    } 

    private static void RandomChange(int previous, int current, int max) 
    { 
     float percent1 = (float)current/(float)max; 
     int percent = (int)(percent1 * 100); 

     Form_Mod frm = Form_Mod.frm; 
     frm.updateProgress(percent); 
    } 
} 

Но как я могу добавить этот код в программе, которую я была предоставлена? У меня нет исходного кода, поэтому я не могу его добавить &, а затем перекомпилировать. Я видел несколько программ, которые, похоже, компилируют файлы .cs на лету, и эти файлы .cs, похоже, втягиваются в основную программу. Как мне это сделать?

И, вероятно, мне придется добавить еще одну кнопку в основную форму, чтобы на самом деле открыть форму «Form_Mod». Поэтому программист, который передал мне основную программу, должен был предоставить способ сделать это, правильно? Или есть другой способ?

private void button2_Click(object sender, EventArgs e) 
{ 
    Form_Mod frm = new Form_Mod(); 
    Mod_HandleEvents.attach(); 
    frm.Show(); 
} 
+0

С точки зрения программирования, слово, которое вы ищете это «плагин». Посмотрите MEF на один способ создания плагинов. –

ответ

2

Вы можете создать плагин. Внедрите интерфейс (общий для всех плагинов), описывающий все методы и функции, которые ожидается предложить плагину. Затем вы можете загрузить плагин динамически (в время выполнения) следующим образом: Assembly.LoadFrom("plugin.dll") - см http://msdn.microsoft.com/en-us/library/1009fa28.aspx

статья, описывающая этот метод более подробно: http://www.codeproject.com/Articles/4691/Plugin-Architecture-using-C

еще одно: http://www.c-sharpcorner.com/UploadFile/rmcochran/plug_in_architecture09092007111353AM/plug_in_architecture.aspx

0

Лучший способ сделать это - импортировать скомпилированный код в качестве ссылки в свой собственный проект. То есть используйте его как библиотеку классов, как и все стандартные ссылки .NET. Затем вы можете использовать свои классы в своем приложении, не беспокоясь о том, что исходный код находится за этой внешней библиотекой.

Для этого в вашем проекте есть папка «Ссылки», щелкните правой кнопкой мыши эту ссылку, добавьте ссылку, затем перейдите к скомпилированному .dll или .exe. После того, как вы добавите его, вы можете использовать класс MakeRandom в своем коде (не забудьте указать соответствующий using или использовать его имя с именем).

+0

Это не совсем то, что я хочу. Возьмем, например, игру Skyrim; кто-то создает Mod, добавляет его в каталог Mod, разрешает Mod, и все сделано. Это то, что я ищу. – natli

+0

Я думаю, что то, что вы описываете, может работать только в том случае, если оригинальная программа была построена модульным способом, так что вы можете заменить определенную часть, не затрагивая остальную часть приложения. В таких играх, как Skyrim, это делается намеренно, и доступен простой интерфейс к моду. В других приложениях, хотя и не преднамеренно разоблаченных, может быть легко увидеть, какие модули можно заменить. Я не думаю, что в целом одна скомпилированная .NET DLL/EXE почти такая гибкая. Одним из возможных решений было бы использовать ILSpy или что-то подобное для декомпиляции кода. –

+0

Я думаю, что я, возможно, использовал плохую формулировку в своем вопросе, потому что то, что вы описываете (намеренно создавая программу для моддинга), именно то, что я хочу. ** Я хочу делать модульные приложения. Я не пытаюсь изменить кого-то. – natli

0

Checkout это link. То, что вы ссылаетесь, обычно называется плагином. Его в основном класс Libary (dll), который реализует интерфейс из одной из ваших библиотек DLL, который определяет, как вы ожидаете, как выглядит плагин. Теперь вы просто просматриваете папку для дополнительных DLL и используете отражение, чтобы найти класс, который реализует ваш интерфейс плагина, когда у вас есть класс и загружается сборка, вы можете создать экземпляр этого типа и использовать его.

2

Кроме того, я бы загрузить плагин в новом домене приложения, чтобы предотвратить его делать что-либо вредоносный, но это немного расширенный ... см Writing C# Plugin System

Смежные вопросы