C#-如何在DLL中打开Windows窗体

C#-如何在DLL中打开Windows窗体,c#,windows,winforms,dll,C#,Windows,Winforms,Dll,我有两个程序:DesktopApp1和DesktopApp2。它们都是Windows窗体,但第一个窗体输出到类库(.dll),第二个窗体引用它 表格1(dll): namespace DesktopApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } public void g

我有两个程序:
DesktopApp1
DesktopApp2
。它们都是Windows窗体,但第一个窗体输出到类库(.dll),第二个窗体引用它

表格1(dll):

namespace DesktopApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void generate()
        {
            crystalReportViewer1.ReportSource = @"C:/Users/me/rel1.rpt";
        }
    }
}
// ...
using DesktopApp1;

namespace DesktopApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DesktopApp1.Form1 r = new DesktopApp1.Form1();
            // The Form 1 window doesn't opens. Nothing happens.
            r.generate();
        }
    }
}
表格2:

namespace DesktopApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void generate()
        {
            crystalReportViewer1.ReportSource = @"C:/Users/me/rel1.rpt";
        }
    }
}
// ...
using DesktopApp1;

namespace DesktopApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DesktopApp1.Form1 r = new DesktopApp1.Form1();
            // The Form 1 window doesn't opens. Nothing happens.
            r.generate();
        }
    }
}
我的期望:

namespace DesktopApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void generate()
        {
            crystalReportViewer1.ReportSource = @"C:/Users/me/rel1.rpt";
        }
    }
}
// ...
using DesktopApp1;

namespace DesktopApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DesktopApp1.Form1 r = new DesktopApp1.Form1();
            // The Form 1 window doesn't opens. Nothing happens.
            r.generate();
        }
    }
}
用户单击表单2的
按钮1
,执行
生成
方法时,会打开一个新的表单1(DLL)窗口

实际发生的情况:

namespace DesktopApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void generate()
        {
            crystalReportViewer1.ReportSource = @"C:/Users/me/rel1.rpt";
        }
    }
}
// ...
using DesktopApp1;

namespace DesktopApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DesktopApp1.Form1 r = new DesktopApp1.Form1();
            // The Form 1 window doesn't opens. Nothing happens.
            r.generate();
        }
    }
}
用户单击
按钮1
,鼠标光标变为加载状态,屏幕上没有显示任何内容


我可能做错了什么?有没有其他方法可以将Windows窗体转换为DLL并从另一个程序打开它?

使用Form.Show(…)或Form.ShowDialog(…)方法。

对于此类信息,您应该使用MSDN(它将提供更多详细信息),或者只使用Visual Studio内置的Intellisense。这些参数都是可选的,因此您可以不带参数地调用任何一个方法。(编辑:我之前回复的评论被删除)很高兴听到。请确保将此标记为答案:)使用调试>全部中断、调试>窗口>线程,并验证是否已选择主线程。查看“调用堆栈”窗口以了解它在做什么。当您不可避免地得出CrystalReports无法正常工作的结论时,请联系SAP寻求支持。