我为某些软件构建了安装程序脚本。我试图对我的安装脚本(InstallationScript.cs)和Form GUI(Install.cs)进行分区。但是,当我尝试从InstallationScript类更新表单组件时,它cannot resolve symbol
,但却可以看到.Show()
之类的方法。我想也许如果我公开自己的公开引用,它将能够看到表单的实例,但这似乎也不起作用。我在这里错过了什么吗?
namespace Generic_Installer_Framework.gui {
public partial class Install : Form {
public static Install Self;
public Install() {
Self = this;
InitializeComponent();
}
public void InstallStep(int value, string message, string logMessage = "") {
Logger.Log(logMessage == "" ? message : logMessage);
installationProgressBar.Value = value;
installationRichTextBox.AppendText(message + "\n");
}
}
}
其他课程:
namespace Generic_Installer_Framework{
class InstallationScript {
private readonly Form _installerForm = Install.Self;
public void Start() {
//This works
_installerForm.Show();
//This doesn't
_installerForm.InstallStep(0, "Starting...");
}
}
}
非常感谢你!
答案 0 :(得分:2)
但是,当我尝试从中更新表单组件时 在InstallationScript类中,它无法解析符号,但还可以看到 像.Show()。
这样的方法
问题就在这里:
private readonly Form _installerForm = Install.Self;
您已将“_installerForm”声明为Form
的泛型类型,当然不知道您在说什么......
将类型更改为Install
,一切都应该是好的:
private readonly Install _installerForm = Install.Self;
答案 1 :(得分:0)
我的猜测可能是因为你在另一个Thread中运行Start()方法。您可以尝试在委托中传递此方法:
public Action<int, string, string> InsStep = new Action<int, string, string>(InstallStep);
尝试在installerForm.InsStep(0, "Starting...", "");
您还可以使用SynchronizationContext.Current属性: 首先,你从表单中取出它:
SynchronizationContext sync = SynchronizationContext.Current;
然后你将它传递给另一个线程或者你想要的东西,并使用如下:
sync.Post(delegate
{
// your updates here will be executed thread-safe
}, null);