我有一个非常非常大且复杂的Visual FoxPro 9应用程序。我想在WPF中重写部分应用程序,最终目标是在几年后完成切割。我花了相当多的时间在google和stackoverflow上搜索一个端到端的“hello world”类型的示例,了解如何使用COM interop实现这一点。找到了点点滴滴,但没有完整显示FoxPro端和WPF端。
我的直觉告诉我,如果我尝试通过COM Interop运行它,我可能会遇到XAML资源,第三方控件或WPF应用程序的其他常规功能的问题。
所以,两个问题。任何人都可以指向一个小的端到端样本,从FoxPro启动WPF窗口或让我删除FoxPro窗体上的WPF用户控件?或者我对可能的互操作问题的关注是对的,应该完全避免这种情况吗?如果是这样,这两个可执行文件是否建议相互通信?
答案 0 :(得分:0)
我完全不知道你是否可以在visual FoxPro中运行wpf。我猜你必须把它写成activex。 我最近做了一些扩展MS Access应用程序的工作。 我的wpf应用程序完全独立,并与ms访问应用程序一起运行。 我使用MS Message Queue在两者之间进行通信 - 这是一个com组件。 也许这种方法对你有用。
当我想通过访问在wpf中显示一个屏幕时,我将一段xml添加到本地消息队列中。 wpf应用程序侦听这些消息,将它们转换为对象,告诉它显示哪个屏幕并为其提供任何参数。 MS Access在消息队列上订阅收到的消息事件,这样可以告诉wpf窗口关闭和用户完成的时间。 这是为了使用strangler模式逐步替换旧访问应用程序中的功能。
这里有一些驱动所有内容的queuelistener代码。从消息中反序列化各种pop类,并将其构建为访问中的字符串。
internal class QueueListener
{
public const string qFromMadge = @".\private$\XXXXQ";
public static string qToMadge = @".\private$\XXXXReturnQ";
private MessageQueue mq;
internal QueueListener()
{
try
{
SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
SubscribeHandler();
var mqSend = setUpQueue(qToMadge);
mqSend.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.InnerException.Message);
}
}
private MessageQueue setUpQueue(string qName)
{
MessageQueue q;
if (MessageQueue.Exists(qName))
{
q = new MessageQueue(qName);
}
else
{
q = MessageQueue.Create(qName);
}
q.ResetPermissions();
q.SetPermissions("Everyone", MessageQueueAccessRights.FullControl, AccessControlEntryType.Set);
q.Purge();
return q;
}
private void ReceiveMsgCompleted(Object source, ReceiveCompletedEventArgs asyncResult)
{
MessageQueue mq = (MessageQueue)source;
Message m = mq.EndReceive(asyncResult.AsyncResult);
m.Formatter = new XmlMessageFormatter(new[] { "XXXX.Popaaaa, XXXX"
, "XXXX.Popbbbb, XXXXX"
, "XXXX.Popcccc, XXXX"
, "XXXX.Popdddd, XXXX"
});
((BasePopView) m.Body).Pop();
mq.BeginReceive();
}
public void UnsubscribeHandler()
{
if (mq == null)
{
return;
}
mq.Close();
mq.ReceiveCompleted -= new ReceiveCompletedEventHandler(ReceiveMsgCompleted);
mq = null;
}
public void SubscribeHandler()
{
if(mq != null)
{
return;
}
mq = setUpQueue(qFromMadge);
mq.ReceiveCompleted += ReceiveMsgCompleted;
mq.BeginReceive();
}