我正在研究一些研究项目,这个迷你项目就是其中的一部分。这个迷你项目的目标是在运行时导入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'
的定义
请告诉我如何解决这个问题?
答案 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);
}