Возвращение строки из C # WinForm .dll - PullRequest
0 голосов
/ 01 июля 2011

У меня есть C # .dll, которая вызывается из приложения C #, использующего «System.Reflection» во время выполнения. .Dll содержит класс WinForm, который используется для отображения информации для пользователя. .Dll вызывается с использованием следующего кода:

    DLL = Assembly.LoadFrom(strDllPath);    
    classType = DLL.GetType(String.Format("{0}.{0}", strNsCn));    
    classInst = Activator.CreateInstance(classType, paramObj);    
    Form dllWinForm = (Form)classInst;      
    dllWinForm.ShowDialog();

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

    System.Reflection.Assembly LoadedAssembly = System.Reflection.Assembly.Load("mscorlib.dll");
    System.Console.WriteLine(LoadedAssembly.GetName());
    object myObject = LoadedAssembly.CreateInstance("System.DateTime", false, BindingFlags.ExactBinding, null, new Object[] {2000, 1, 1, 12, 0, 0}, null, null);
    MethodInfo m = LoadedAssembly.GetType("System.DateTime").GetMethod("ToLongDateString");
    string result = (string) m.Invoke(myObject, null);

но как это сделать для моего случая WinForm, вызываемого из .dll во время выполнения?

Любые предложения будут наиболее признательны.

Ответы [ 2 ]

1 голос
/ 01 июля 2011

Ладно, чтобы свести вопрос и комментарии вниз, мы пытаемся сделать здесь приложение на C #, которое загружает dll, который был внедрен сторонним разработчиком на более позднем этапе, и приложение должно получить некоторая информация о состоянии от компонента в загруженной dll (факт, что компонент использует WinForms против некоторого другого пользовательского интерфейса, кажется совершенно несущественным).

Лучший способ сделать это - начать с интерфейса или базового класса, который может быть разделен между хост-приложением и загруженным компонентом. Для достижения этого интерфейс должен быть в отдельной DLL. Итак, сначала мы создаем проект библиотеки классов и добавляем следующий класс:

using System;
using System.Windows.Forms;

namespace SimplePluginShared
{
    public class PluginBase : Form
    {
        public virtual String GetStatus()
        {
            return null;
        }
    }
}

Затем добавьте ссылку на эту библиотеку классов из проекта, который реализует компонент, который вы загружаете с помощью отражения (или поделитесь им с вашей третьей стороной для их реализации). Вот пример реализации базы плагинов:

using System;
using System.Windows.Forms;
using SimplePluginShared;

namespace SimplePluginExample
{
    public partial class MyForm : PluginBase
    {
        private String _status = "Unspecified";

        public MyForm()
        {
            InitializeComponent();
        }

        public override string GetStatus()
        {
            return _status;
        }

        private void btnGive_Click(Object sender, EventArgs e)
        {
            _status = "Give Him The Stick.";
            this.DialogResult = DialogResult.OK;
            this.Close();
        }

        private void btnDontGive_Click(object sender, EventArgs e)
        {
            _status = "Don't Give Him The Stick!";
            this.DialogResult = DialogResult.Cancel;
            this.Close();
        }
    }
}

И, наконец, код для загрузки и вызова компонента:

using System;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
using SimplePluginShared;

namespace SimplePluginHost
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void btnBrowse_Click(Object sender, EventArgs e)
        {
            OpenFileDialog openPluginDlg = new OpenFileDialog() { DefaultExt = "dll", Multiselect = false, Title = "Open Plugin DLL", Filter = "DLLs|*.dll" };
            if (openPluginDlg.ShowDialog() == DialogResult.OK)
            {
                txtPluginPath.Text = openPluginDlg.FileName;
            }
        }

        private void btnGo_Click(Object sender, EventArgs e)
        {
            Assembly pluginDll = Assembly.LoadFrom(txtPluginPath.Text);
            Type pluginType = pluginDll.GetTypes().Where(t => typeof(PluginBase).IsAssignableFrom(t)).First();
            PluginBase pluginInstance = (PluginBase)Activator.CreateInstance(pluginType);
            pluginInstance.ShowDialog();
            MessageBox.Show(pluginInstance.GetStatus());
        }
    }
}

Вот некоторые скриншоты:

Displaying the Dialog

Displaying the Status Text

0 голосов
/ 01 июля 2011

Почему вы не можете добавить dll в качестве ссылки на ваш проект и назвать его так?(Как и любая другая сборка?)

enter image description here enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...