2014-01-27 88 views
0

在其他人族计算机上运行我的程序时出现此异常。在MainWindow类型上调用构造函数抛出异常

The invocation of the constructor on type TCPp2pTutorialWPF.MainWindow that matches the specified binding constraints threw an exception.从PresentationFramework,方法来:Void RewrapException(System.Exception, System.Xaml.IXamlLineInfo, System.Uri)

内异常Object reference not set to an instance of an objectFinalize()

未来我无法重现此我自己的系统上,或者在虚拟机上,或者找出什么原因引起的。我很困惑,因为我还没有写最后确定()

C#代码:

namespace TCPp2pTutorialWPF 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
    { 
    p2pchat network = null; 
    SelectUsername name = new SelectUsername(); 


    public void MessageRecieved(string username, string message, bool isDisconnect) 
     { 
     ChatText.Dispatcher.Invoke((Action) (() => 
      { 
      ChatText.AppendText(username + ": " + message+"\r"); 


      try 
       { 
       if (isDisconnect) 
        { 
        Users.Dispatcher.Invoke((Action) (() => 
         { 
          Users.Items.Remove(username); 
         })); 

        } 
       } 
      catch (NullReferenceException f) 
       { 
       MessageRecieved("ERROR", "We tried accessing the name list when it was null or something (??) "+f.Message + " " + f.Source, false); 
       } 
      })); 



     } 


    public void NewUser(string user) 
     { 
     ChatText.Dispatcher.Invoke(new Action(() => 
      { 
      Users.Items.Add(user); 
      })); 
     } 


    public MainWindow() 
     { 

     try 
      { 
      InitializeComponent(); 
      } 
     catch (Exception e) 
      { 
      MessageBox.Show("Error initializing main chat window " + e.Message + " " + e.Source + " " + e.HelpLink.ToString() + " " + e.TargetSite); 
      } 

     if (string.IsNullOrEmpty(name.UserName)) 
      try 
       { 
       name.ShowDialog(); 
       } 
      catch (Exception e) 
       { 
       MessageRecieved("ERROR", e.Message, false); 
       } 
     network = new p2pchat(); 
     ChatText.AppendText("port " + network.Port + " may need to be forwarded to accept incoming connections\r"); 

     //add the handlers 
     network.ReceivedMessageHandler += MessageRecieved; 
     network.NewUserHandler += NewUser; 
     network.MyUserName = name.UserName; 
     network.Start(); 

     } 



    private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 

     } 



    private void Button_Click(object sender, RoutedEventArgs e) 
     { 
     Window1 getip = new Window1(); 
     try 
      { 
      getip.ShowDialog(); 
      } 
     catch (Exception ee) 
      { 
      MessageRecieved("ERROR", ee.Message, false); 
      } 

     string Ip = getip.Ip; 

     if (!string.IsNullOrEmpty(Ip)) 
      network.MakeConnection(Ip); 
     } 




    private void SendBox_KeyDown(object sender, KeyEventArgs e) 
     { 
     if (e.Key.Equals(Key.Enter)) 
      { 
      network.SendMessage(new TextRange(SendBox.Document.ContentStart, SendBox.Document.ContentEnd).Text); 
      SendBox.Document.Blocks.Clear(); 
      } 
     } 


    } 
} 

XAML:

<Window x:Class="TCPp2pTutorialWPF.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Chat" Height="379.439" Width="716.9" WindowStartupLocation="CenterScreen"> 
<Grid x:Name="Chat_Window"> 

    <RichTextBox x:Name="ChatText" HorizontalAlignment="Left" Height="280" Margin="0,23,0,0" VerticalAlignment="Top" Width="553" SpellCheck.IsEnabled="True" IsReadOnly="True" IsUndoEnabled="False" VerticalScrollBarVisibility="Auto" AcceptsReturn="False"> 
     <RichTextBox.Effect> 
      <DropShadowEffect/> 
     </RichTextBox.Effect> 
     <FlowDocument AllowDrop="False"/> 
    </RichTextBox> 
    <ListBox x:Name="Users" HorizontalAlignment="Left" Height="280" Margin="558,23,0,0" VerticalAlignment="Top" Width="141" SelectionChanged="ListBox_SelectionChanged"/> 
    <Menu x:Name="Menu" HorizontalAlignment="Left" Height="23" VerticalAlignment="Top" Width="699"> 
     <Button Content="User name"/> 
     <Button x:Name="addip" Content="Add IP" Click="Button_Click"/> 
    </Menu> 
    <RichTextBox x:Name="SendBox" HorizontalAlignment="Left" Height="30" Margin="0,318,0,0" VerticalAlignment="Top" Width="699" SpellCheck.IsEnabled="True" KeyDown="SendBox_KeyDown" AcceptsReturn="False"> 
     <FlowDocument> 
      <Paragraph> 
       <Run Text=""/> 
      </Paragraph> 
     </FlowDocument> 
    </RichTextBox> 

</Grid> 

编辑:将在堆栈跟踪的屏幕截图,不打算输入那个。现在将它记录到一个文件。

并添加upnp_helper代码,因为它似乎引用它。

namespace TCPp2pTutorialWPF 
{ 
class UPNP_Helper 
    { 
    UPnPNAT NatMgr; 
    List<int> ports = new List<int>(); 

    public UPNP_Helper() 
     { 
     NatMgr = new UPnPNAT(); 
     } 


    ~UPNP_Helper() 
     { 
     foreach (int i in ports) 
      { 
      try 
       { 
       NatMgr.StaticPortMappingCollection.Remove(i, "TCP"); 
       } 
      catch 
       { 
       } 
      } 
     } 





    public bool AddMappingToThisLocalIp(int port) 
     { 
     try 
      { 
      NatMgr.StaticPortMappingCollection.Add(port, "TCP", port, LocalIPAddress().ToString(), true, "p2pChat"); 
      ports.Add(port); 
      return true; 
      } 
     catch 
      { 
      return false; 
      } 
     } 




    private IPAddress LocalIPAddress() 
     { 
     if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) 
      { 
      return null; 
      } 

     IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName()); 
     return host 
      .AddressList 
      .FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork); 
     } 

    } 
} 
+1

请发布内部异常的堆栈跟踪。 – Dennis

+0

这是什么'SelectUsername name = new SelectUsername();'干嘛?也许这条线是有问题的,请注释掉,看看它是否有效 – Jehof

+0

这是创建一个新窗口来选择一个用户名。我会研究它。编辑:不,那个窗口必须被创建为引用类型。 – fotg

回答

0

.NET 4.5 for Windows 8.1中包含的WPF似乎是一个稍微更新的版本,它比.NET 4.5 for Windows 7中包含的版本稍微更新,我的测试主题声称拥有最新版本,但找不到安装的实际版本。这个问题是由app.Run();造成的,并且是通过针对早期版本的.NET解决的。

0

这是一个常见的开发场景。在另一台机器上运行时,代码中的东西是null ......但是什么?找出最简单的方法是一堆电话添加到MessageBox.Show

public MainWindow() 
{ 

try 
    { 
    InitializeComponent(); 
    } 
catch (Exception e) 
    { 
    MessageBox.Show("Error initializing main chat window " + e.Message + " " + e.Source + " " + e.HelpLink.ToString() + " " + e.TargetSite); 
    } 

MessageBox.Show(string.Format("name: {0}, UserName: {1}", name, name.UserName)); 

if (string.IsNullOrEmpty(name.UserName)) 
    try 
     { 
     name.ShowDialog(); 
     } 
    catch (Exception e) 
     { 
     MessageRecieved("ERROR", e.Message, false); 
     } 
network = new p2pchat(); 

MessageBox.Show(string.Format("ChatText: {0}, network: {1}", ChatText, network)); 

ChatText.AppendText("port " + network.Port + " may need to be forwarded to accept incoming connections\r"); 

//add the handlers 
network.ReceivedMessageHandler += MessageRecieved; 
network.NewUserHandler += NewUser; 
network.MyUserName = name.UserName; 
network.Start(); 

} 

现在你应该得到一些MessageBox ES弹出相关值,其中一人应该是null。所以,这是问题的一半整理出来...下一个只需要计算出为什么值为null并解决它。

相关问题