【问题标题】:linking c# gui project and library dll project链接 c# gui 项目和库 dll 项目
【发布时间】:2014-12-19 19:29:27
【问题描述】:

这个 sn-p 是一个类似于 helloworld 的示例,说明了我试图实现的框架目标。该项目的目标是通过 C# 或 VBA 中的一段单独代码来控制 GUI,例如与设备和其他软件对话的自动化程序。 GUI 的存在是为了让不使用自动化的用户受益,但我也想自动化 GUI 的各个部分,就好像有人在那里一样

我正在尝试如上所述将 GUI 和 COM dll 链接在一起,但没有取得多大成功。

两个项目分开工作。

  1. 我已验证我可以调用 COM dll 函数。

  2. 我还验证了简单的 GUI 工作原理。

  3. 现在我想在 GUI 中添加可从 COM dll 调用的函数。

我认为这就像添加另一个项目并添加引用一样简单,但我做错了。这很有趣,因为代码完成让我看起来非常接近,从截图中可以看出。

GUI 项目:

namespace GUI_HELLOWORLD
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        public void Button1_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("Hello World.");
        }
        public void Button1_Click()
        {
            //For the sake of clicking through code - figure out correct method later
            MessageBox.Show("Hello World.");
        }
    }
 }

DLL 项目:

namespace GUI_COM_LIB
{
    [System.Runtime.InteropServices.ComVisible(true)] //- may not be necessary in some cases?
    public class ZZ_GUI_HELLOWORLD_API_DEMO
    {
        public void SelHello()
        {
            GUI_HELLOWORLD.MainWindow.Button1_Click(); // ERROR!
        }

在 COM_LIB dll 项目中添加对 GUI 的引用时,我可以在弹出菜单中看到 GUI,所以它就在那里!但是,当我输入 GUI_HELLOWORLD.MainWindow. 时,没有出现我希望看到 Button1_Click() 的公共函数

【问题讨论】:

  • 我仔细查看了您的屏幕截图,您确定您的参考资料正确吗?您的库正在引用您的 GUI 项目。 假设您已经为您的 COM 组件生成了一个程序集(看起来您已经有了),您将添加对您的 GUI 项目的引用并将该引用指向 COM 程序集。
  • 关于你上面的最终截图,韦斯所说的似乎是正确的。您尚未构建“MainWindow”以调用按钮单击。 “Button_Click”作为您的 MainWindow 类中的单击处理程序存在,但您为什么要尝试从您的类库中引用此处理程序?也许如果我能更好地理解你的目标,我就能找到一条清晰的解决方案。我不会以这种方式亲自设计解决方案,所以如果没有更多的上下文,我真的无法提供更多帮助。对我来说有点陌生。
  • 我绝对确定我的参考资料是正确的。我想从另一个程序中调用 GUI 的元素。所以我必须在其他程序中引用 GUI 项目。韦斯所说的是解决根本问题。他的解决方案适用于创建一个新窗口,但我想访问已经打开的窗口,而不是新创建的 GUI。对更好的架构有什么想法吗?

标签: c# .net visual-studio user-interface


【解决方案1】:

您需要一个窗口对象的实例:

public void SelHello()
{
    var myWindow = new GUI_HELLOWORLD.MainWindow();
    myWindow.Button1_Click();
}

【讨论】:

  • 也许我理解错了。这似乎是两个相互通信的 .NET 项目。
  • 看起来他已经从 COM Component 生成了程序集,但是再看截图后,他的引用是向后的
  • 这行得通。如果我单击 button1,它会生成弹出窗口。然而,这并不是我想要的。我想点击 GUI 中已经打开的按钮。
【解决方案2】:

COM 组件从未如此简单。 你看过这本古籍吗?

Calling COM Components from .NET Clients

具体来说,您是否在 COM 组件上运行过 TLBIMP?

编辑

看看这个Stack Overflow question This Blog Post

您的客户端是作为 Excel 插件构建的吗? (使用 Visual Studio Tools for Office)

【讨论】:

  • 任何其他向 C# GUI 提供 excel vba API 的方法?
  • 当然。您的 C# GUI 是 Excel 插件吗?
  • 嗯,我可能不得不追求这个,它目前不是一个加载项。我目前的问题是我有一个可以工作的 GUI,并且我有一个可以从 excel 调用的工作 C# COM 库。我还需要 GUI 的各个部分也可以调用 excel。
【解决方案3】:

WCF named pipe minimal example

我在这个帖子中找到了解决方案。通过使用通道系统,可以创建一个界面,并且可以将来自 GUI 的功能通过管道传输到 dll。然后可以从 C#、Excel VBA 或其他 .NET 调用该 dll。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    相关资源
    最近更新 更多