尝试使用在控制台应用程序中运行时导入的DLL来显示Windows窗体

时间:2015-03-10 15:38:06

标签: c# .net winforms dll console-application

我正在研究一些研究项目,这个迷你项目就是其中的一部分。这个迷你项目的目标是在运行时导入DLL并加载存储在该DLL中的GUI。我试图从DLL的函数触发Windows窗体的Show()函数。这是代码的样子: 控制台应用程序代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
namespace DLLTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string DLLPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\TestLib.dll";
            var DLL = Assembly.LoadFile(DLLPath);

            foreach (Type type in DLL.GetExportedTypes())
            {
                dynamic c = Activator.CreateInstance(type);
                c.test();
            }

            Console.ReadLine();
        }
    }
}

DLL类库代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestLib
{
    public class Test
    {
        public int test()
        {
            Form1 form = new Form1();
            form.Show();
            return 0;
        }
    }
}

当我只返回一些值并在控制台应用程序上显示时,函数test()正常工作。但是,当我尝试显示表单时,它向我展示了这个例外:

  

' TestLib.Form1'不包含' test'

的定义

请告诉我如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

问题是Activator.CreateInstance没有返回ExpandObject(动态)。 你应该通过反射运行test(),如下所示:

    foreach (Type type in DLL.GetExportedTypes())
    {
        dynamic c = Activator.CreateInstance(type);
        MethodInfo methodInfo = type.GetMethod("test");
         methodInfo.Invoke(c , null);
    }