【问题标题】:Get string from dll in second window在第二个窗口中从 dll 获取字符串
【发布时间】:2014-06-17 13:24:54
【问题描述】:

我在从 dll 文件中读取字符串时遇到问题。以下是一些清单。我不知道为什么在 window1 中我得到空字符串。在 MainWindow 中,我可以从 dll 文件中读取。我想从window2、window3中的dll中读取这个字符串……怎么办?

dll文件,

namespace stringTest
{
    public class DllstringTest
    {
        string string1;
        public string testString
        {
            get
            {
                return this.string1;
            }

            set
            {
                this.string1 = value;
            }
        }

    }
}  

MainWindow 应用程序,

 public partial class MainWindow : Window
 {

    public MainWindow()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        DllstringTest st = new DllstringTest();
        st.testString = "5";
        Window1 w1 = new Window1();
        w1.Show();
    }
}

窗口1,

namespace stringTest_app
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            DllstringTest st1 = new DllstringTest();
            MessageBox.Show(st1.testString);

        }
    }
}

【问题讨论】:

  • 这与它是一个 dll 无关,您正在创建 DllstringTest 的两个 new 实例,您需要在表单之间传递它。

标签: c# wpf dll get set


【解决方案1】:

您应该使用静态变量。您目前面临的问题是您有两个不同的类实例。

解决方案是创建一个静态 DllstringTest 变量并在您的应用程序中使用它。

【讨论】:

  • 为此使用静态变量是一个糟糕的主意 IMO
  • @Sayse:在你写评论之前我没能完成我的回答。正如我所说,要么他的 dll 中有静态变量,要么他可以创建 DllstringTest 类的单个静态实例并在整个应用程序中使用它。
  • static 任何东西都是一个坏主意,变量应该限制在它的范围内。最重要的是,这是对 OP 的训练练习,因此不应鼓励不良习惯。
  • @Sayse:静态变量不是罪,知道什么时候使用它们就好了。
【解决方案2】:

通过构造函数将st注入window1:

主窗口应用程序

public partial class MainWindow : Window
    {

    public MainWindow()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        DllstringTest st = new DllstringTest();
        st.testString = "5";
        Window1 w1 = new Window1(st);
        w1.Show();
    }
}
}

窗口1:

namespace stringTest_app
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
    private DllstringTest st;
    public Window1(DllstringTest st)
    {
        this.st = st;
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        //DllstringTest st1 = new DllstringTest();
        MessageBox.Show(this.st.testString);

    }
}

}

【讨论】:

    【解决方案3】:

    问题是您正在使用 DllstringTest 的单独实例。您不能在一个实例中设置一个值并让它神奇地设置所有未来的实例。 (从技术上讲你可以,但这不是你想做的,也不会是魔法)

    您可以使用静态类,但您只需要一个实例:

    public static class DllstringTest
    {
        public static string testString { get;set; }
    }
    

    你可以这样访问:

    DllstringTest.testString
    

    或者(可能是更好的方法)您可以将实例从主表单传递到其他表单:

    //IN MainWindow
    private void button1_Click(object sender, RoutedEventArgs e)
    {
        DllstringTest st = new DllstringTest();
        st.testString = "5";
        Window1 w1 = new Window1();
        w1.DllInstance = st;
        w1.Show();
    }
    
    //IN Window1
    public partial class Window1 : Window
    {
        public DllstringTest DllInstance { get;set; }
    
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(DllInstance.testString);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-06-08
      • 2021-02-10
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 2012-01-22
      • 2015-01-17
      • 2017-05-06
      • 1970-01-01
      相关资源
      最近更新 更多