Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF-VB6互操作导致计时器运行时错误_C#_Wpf_Vb6_Com Interop - Fatal编程技术网

C# WPF-VB6互操作导致计时器运行时错误

C# WPF-VB6互操作导致计时器运行时错误,c#,wpf,vb6,com-interop,C#,Wpf,Vb6,Com Interop,我创建了以下测试场景来跟踪VB6-WPF互操作的错误: 有一个.Net WPF DLL,它显示带有文本框的表单。文本框不处理键盘输入-没有数据绑定,没有事件处理程序。DLL是COM可见的 VB6.exe调用DLL ShowWindow函数以显示WPF表单。当我在文本框中键入任何键时,它会在VB应用程序中导致“运行时错误'6'溢出”错误。该错误发生在计时器1事件的“dVal=0”行中 我猜发生错误是因为未处理的密钥事件被冒泡到VB6应用程序。WPF事件是否应该冒泡到VB6?为什么问题会出现在计时器

我创建了以下测试场景来跟踪VB6-WPF互操作的错误:

有一个.Net WPF DLL,它显示带有文本框的表单。文本框不处理键盘输入-没有数据绑定,没有事件处理程序。DLL是COM可见的

VB6.exe调用DLL ShowWindow函数以显示WPF表单。当我在文本框中键入任何键时,它会在VB应用程序中导致“运行时错误'6'溢出”错误。该错误发生在计时器1事件的“dVal=0”行中

我猜发生错误是因为未处理的密钥事件被冒泡到VB6应用程序。WPF事件是否应该冒泡到VB6?为什么问题会出现在计时器中?为什么只有设置了双变量时才会发生这种情况?如果“dVal=0”行不存在,则不会发生这种情况。有什么想法吗

显示窗口的公共类的C#代码:

public class NetFormIFace : INetFormIFace
{

    public void ShowWindow1()
    {
        Window1 w1;
        w1 = new Window1();
        w1.Show();
    }

}
用于窗口的XAML。未向代码中添加任何内容:

<Window x:Class="SSEC.NetForm.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
    <Canvas>
        <TextBox Height="34" Canvas.Left="35" TextWrapping="Wrap" Text="TextBox" Canvas.Top="52" Width="94" />
    </Canvas>
</Window>

您正在创建一个无模式WPF弹出窗口,该窗口在非托管VB6应用程序的消息循环上运行。这里有一些规则:。我不确定这在您的特定情况下是否会有所帮助,即使您成功地在VB6端实现了消息循环要求

理想情况下,您应该在VB6端创建一个非托管Win32弹出窗口,并使用在该窗口中托管WPF内容。检查


或者,您可以尝试将WPF复合控件作为VB6的ActiveX控件公开。首先,您需要确保它在VB.NET WinForms中工作,请检查。然后,使用将WinForms
UserControl
作为ActiveX控件公开给VB6。我可能会这样做。

我们发现,如果在访问GUI元素的VB6计时器例程的开头添加一行代码,则不会发生错误。在本例中,我们添加了一行来读取计时器间隔。我们将此用作临时修复,同时评估更好的方法

Private Sub Timer1_Timer()
    Dim iVal As Integer
    Dim dVal As Double
    Dim lTemp as long

    lTemp = Timer1.Interval ' The error does not occur if this (any GUI?) element is read. I don't know why.

    iVal = 0    ' Does not cause an error
    dVal = 0    ' Causes an error
End Sub

接受这个答案,因为我同意共享消息循环是问题所在。这是在编译VB6代码时发生的,还是仅在VB6 IDE中运行时发生的?