【发布时间】:2016-09-21 18:28:52
【问题描述】:
我有一个功能齐全的应用程序,已转换为 Dll。
我需要能够从 exe 中运行该应用程序(现在是 dll)。我已将 dll 添加为对新 exe 的引用,并尝试从 dll 中使用的命名空间中实例化一个 frmMain 对象,并像在任何其他应用程序中一样显示它。
但是,在我转换为 dll 的 exe 中的几个引用中,我得到了一堆空引用异常。
我也试过这里的解决方案Launch Dll using C# program 并尝试跳转到 Program.cs Main() 函数,此时我得到一个“必须在应用程序中创建第一个 IWin32Window 对象之前调用 SetCompatibleTextRenderingDefault”。错误。
这里是dll的program.cs
namespace VTRS
{
class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain());
}
//had to add this because exe can't find Main
public void invokeMain()
{
Main();
}
//you have to have a constructor for the exe to instantiate this class
public Program()
{
}
}
}
这是新的应用程序代码
private void button1_Click(object sender, EventArgs e)
{
try
{
System.Reflection.Assembly dll1 = System.Reflection.Assembly.LoadFile(Application.StartupPath + "\\VTRSTCACodeMaintenance.dll");
if (dll1 != null)
{
object obj = dll1.CreateInstance("VTRS.Program");
if (obj != null)
{
System.Reflection.MethodInfo mi = obj.GetType().GetMethod("invokeMain");
mi.Invoke(obj, new object[0]);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
谁能向我解释为什么这不起作用或指出我正确的方向?我超级困惑,不是自愿这样做的(老板告诉我的)
【问题讨论】:
-
为什么要使用反射来访问 DLL?为什么不直接访问它呢?我认为您提到的所有问题都源于您正在上游使用您的 DLL 的事实。只需引用它并从中实例化您需要的任何类。当然,您必须调整访问修饰符。
-
我真的不确定。你能给我一个例子吗?我很抱歉,但这是我第一次真正使用实际显示表单等的 dll,而我不仅仅是调用 dll 中的方法并获得结果。
-
道歉,但我不应该给你举个例子。要么你知道怎么做,要么你不知道,在这种情况下,我建议你买一本关于 C# 和 .NET 的书或教程,并学习如何编码。无论哪种方式,这都是本网站的主题。