在Visual Studio 2015中引用另一个项目

时间:2016-03-07 19:03:34

标签: c# .net

以下是该方案 我有2个C#窗体表单项目,项目A和项目B.项目A有一个文本框和一个按钮。按下该按钮时,文本框中的任何值都将保存在另一个类中。我们将此ClassA称为ClassA.myString = textbox.Text;,并通过public class ClassA { public String myString { get; set; } } 保存。

using ProjectA;

namespace projectBSolution
{
   public class ProjectB
   {
      ClassA myClass;
      public ProjectB()
      {
          InitializeComponent();
          myClass = new ClassA();
      }
      private void btn_click(object sender, EventArgs e)
      {
         label1.Text = myClass.myString;
      }
   }
}

现在项目B有一个按钮和一个标签。按下按钮时,应将标签设置为项目A中保存到ClassA中的值。我已经通过右键单击项目建立了引用,单击添加,引用,然后从项目B指向项目A.我使用过ProjectA;在我的项目B形式中,但我无法获得超值的价值。以下是我尝试失败的一种方法。

{{1}}

这个问题是它没有返回我的值,因为我正在初始化该类的新版本。如果我没有初始化新版本,它每次都返回null。任何帮助表示赞赏。谢谢。

2 个答案:

答案 0 :(得分:1)

如果这些项目在不同的流程中运行,则必须使用其中一种机制进行进程间通信,请查看此链接http://weblogs.asp.net/ricardoperes/local-machine-interprocess-communication-with-net

答案 1 :(得分:0)

如果您可以在另一个项目中使用一个项目的组件,但不将它们作为两个单独的可执行文件运行,那么这是一件非常简单的事情。在这里,我假设您正在使用WPF,但您可以将类似的技术应用于WinForms或您正在使用的任何其他框架:

App A:

4x4

应用B:

<Window x:Class="SampleApp.A.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:SampleApp.A"
        mc:Ignorable="d"
        Title="A" 
        SizeToContent="WidthAndHeight">
    <StackPanel>
        <TextBox x:Name="textBox" VerticalAlignment="Center"
                 Width="250" Margin="10" Height="30"/>
        <Button Content="Save" Width="80" Margin="10" Click="Button_Click"/>
    </StackPanel>
</Window>

using System.Windows;

namespace SampleApp.A
{
    public partial class MainWindow : Window
    {
        public string Text { get; set; }

        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Text = textBox.Text;
        }
    }
}

请注意,我尽可能简单明了。理想情况下,您可以使用<Window x:Class="SampleApp.B.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:SampleApp.B" mc:Ignorable="d" Title="B" SizeToContent="WidthAndHeight"> <StackPanel> <Label x:Name="label" VerticalAlignment="Center" Width="250" Margin="10" Height="30"/> <Button Content="Load" Width="80" Margin="10" Click="Button_Click"/> </StackPanel> </Window> using System.Windows; namespace SampleApp.B { public partial class MainWindow : Window { private A.MainWindow A; public MainWindow() { InitializeComponent(); this.Loaded += MainWindow_Loaded; } private void MainWindow_Loaded(object sender, RoutedEventArgs e) { A = new A.MainWindow(); A.Show(); } private void Button_Click(object sender, RoutedEventArgs e) { label.Content = A.Text; } } } ,MVVM以及一大堆其他设计技巧和模式,这些示例中明显缺少这些技术和模式。

该示例显示的是,您可以让一个项目从另一个项目启动窗口并访问其公共属性。当然,这不是两个可执行文件交互。如果单独的可执行文件是您的目标,那么选项有点棘手,它们从Interop窗口句柄到消息传递以及其间的许多内容都有所不同。

例如,您可以使用IO.Pipes来处理您的消息传递例程。下面是一个例子,但是它非常粗糙,缺乏大量的安全检查,并且可能在使用几分钟后崩溃(我没有时间进行测试,因为我正在前进)。它与上面的示例类似 - 您在App A中键入文本,单击Save然后单击在App B中加载。您将注意到App A将被冻结,直到您在App B中读取文本。就像我说,这不是一个生产应用程序,只是一个概念证明。我保证它会做错事 - 这纯粹是一个建立的例子。

App A:

INotifyPropertyChanged

App B

using System.IO;
using System.IO.Pipes;
using System.Windows;

namespace SampleApp.A
{
    public partial class MainWindow : Window
    {
        private NamedPipeClientStream pipeClient;
        public string Text { get; set; }

        public MainWindow()
        {
            InitializeComponent();
            this.Loaded += MainWindow_Loaded;
            this.Closing += MainWindow_Closing;
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            pipeClient = new NamedPipeClientStream(".", "1234", PipeDirection.Out);
            pipeClient.Connect();
        }

        private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            pipeClient?.Close();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Text = textBox.Text;

            using (var sw = new StreamWriter(pipeClient))
            {
                sw.WriteLine(Text);
                sw.Flush();
            }
        }
    }
}

理想情况下,您会有一个循环或事件来跟踪传入的流内容,而不必按下按钮来获取它。

除此选项外,您还有许多其他很棒的选项,例如WCFMSMQ。他们更健壮,值得学习。