以下是该方案
我有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。任何帮助表示赞赏。谢谢。
答案 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();
}
}
}
}
理想情况下,您会有一个循环或事件来跟踪传入的流内容,而不必按下按钮来获取它。