2013-12-13 11 views
6

以下、私が受け取っているエラーを再現する方法を説明します。それはVS 2010、2012、および2013で同じように動作します。これを複数のプロジェクトに分割すると、以下に示すように重要になります。XAMLから.NETへのコード生成のバグが原因で、この名前空間が衝突しますか?

手順エラーを再現する:

  1. ソリューションを作成します。

    using System; 
    
    namespace Common 
    { 
        public delegate void Handler(object sender, EventArgs args); 
    } 
    
  2. がMyControlLibraryと呼ばれるWPFユーザーコントロールライブラリプロジェクト、共通の参照を作成します:

  3. はHandler.csという名前のファイルを含む、一般的と呼ばれるC#クラスライブラリを作成します。その中に、MyControl.xamlというユーザーコントロールを作成します。

    MyControl.xaml:

    <UserControl x:Class="ControlNamespace.MyControl" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        mc:Ignorable="d" 
        d:DesignHeight="300" d:DesignWidth="300"> 
        <Grid> 
    
        </Grid> 
    </UserControl> 
    

    MyControl.xaml.cs:

    using System.Windows.Controls; 
    using Common; 
    
    namespace ControlNamespace 
    { 
        public partial class MyControl : UserControl 
        { 
         public MyControl() 
         { 
          InitializeComponent(); 
         } 
    
         public event Handler MyEvent; 
        } 
    } 
    
  4. コモン、MyControlLibraryを参照し、MyWpfApplicationと呼ばれるWPFアプリケーションプロジェクトを作成します。その中に、WindowNamespace.Common.csとMyWindow.xamlというウィンドウを作成します。

    WindowNamespace.Common.cs:

    namespace WindowNamespace.Common 
    { 
    } 
    

    MyWindow.xaml:

    <Window x:Class="WindowNamespace.MyWindow" 
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
         xmlns:c="clr-namespace:ControlNamespace;assembly=WpfControlLibrary1" 
         Title="MyWindow" Height="300" Width="300"> 
        <Grid> 
         <c:MyControl MyEvent="MyControl_MyEvent" /> 
        </Grid> 
    </Window> 
    

    MyWindow.xaml.cs:

    using System; 
    using System.Windows; 
    
    namespace WindowNamespace 
    { 
        public partial class MyWindow : Window 
        { 
         public MyWindow() 
         { 
          InitializeComponent(); 
         } 
    
         void MyControl_MyEvent(object sender, EventArgs args) 
         { 
         } 
        } 
    } 
    
  5. ソリューションをビルドします。

あなたはMyWindow.xamlの7行目に指して、次のエラーを受け取る必要があります:あなたはMyWindow.xaml用に生成.gicsファイルを開く

The type or namespace name 'Handler' does not exist in the namespace 'WindowNamespace.Common' (are you missing an assembly reference?)

場合は、次のように表示されるはずですIComponentConnector.Connect方法:

#line 7 "..\..\MyWindow.xaml" 
((ControlNamespace.MyControl)(target)).MyEvent += new Common.Handler(this.MyControl_MyEvent); 

問題の原因は、WindowNamespaceでCommon.Handlerを見つけようとしていることです。

#line 7 "..\..\MyWindow.xaml" 
((ControlNamespace.MyControl)(target)).MyEvent += new global::Common.Handler(this.MyControl_MyEvent); 

またはファイルの先頭に使用を追加することによって:これはそれのように生成したことによって解決することができ

using Common; 

... 

#line 7 "..\..\MyWindow.xaml" 
((ControlNamespace.MyControl)(target)).MyEvent += new Handler(this.MyControl_MyEvent); 

これらすべてのソースファイルが単一のプロジェクトにバンドルされている場合は注意することを、 .gicsファイルが別々に生成される(つまり、イベントに明示的にハンドラを追加しない)ため、エラーは消えてしまいます。

これは実際にはXAML - > .NET変換のバグですか、間違っているのですか?

Error 1 Cannot implicitly convert type 'WindowNamespace.Common.Handler' to 'Common.Handler' c:\Dev\YourSolution\MyWpfApplication\MyWindow.xaml 7 63 MyWpfApplication 

共通のプロジェクトは「共通」と呼ばれるグローバル名前空間を宣言している:あなたはMyWpfApplicationであなたのWindowNamespace.Common名前空間宣言でハンドラデリゲートを再宣言してコンパイルしようとした場合の手がかりは何が起こっているかのようあります

+0

この問題を再現していただきありがとうございます。あまりにも悪いことに、まだ解決策はありません。いくつかの** clr-namespace:... **調整が**グローバル:**のネームスペースで問題を解決するように見えるでしょう。 –

答えて

0

これはあなたのコントロールライブラリも使用しています。しかし、アプリケーションが "WindowNamespace.Common"を明示的に宣言すると、親コントロールが存在するのと同じ名前空間になるローカル名前空間が作成されます。これはVisual Studio documentation for Compiler Error CS0433で説明されているあいまい性の問題を効果的に作成します。

MyWpfApplicationの共通の名前空間宣言を「共通」に変更するだけで問題は解決します。

+0

名前空間衝突の性質については正しいですが、Commonは、グローバルCommonではなく現在の名前空間内に存在するものを指していると仮定しています。しかし、同じ名前を共有する2つの名前空間は一般的であり、C#はこれらの名前の1つを名前を変更せずに解決するためのメカニズムを提供します。これらのメカニズムは、XAMLがこれを行う方法を公開していない限り、私はC#を書いているわけではないので、この場合は単純に使用できません。 –

+0

あなたはすでにエイリアシングを考慮し拒否したとしますか?より多くの詳細を提供しなければならないかもしれません。どちらの方法でも、これはコンパイラのバグとはみなされませんが、それはあなたが与えている名前空間を使用しています。イベントをICommandなどにバインドして、コード内の衝突を解決できませんか? –

+0

私はエイリアシングがここでどのように役立つかについては不明です。あなたは明確にすることができますか?解決できないタイプは指定しないので、名前空間エイリアスを提供する機会はありません。これは、XAMLイベントバインディングに基づいてイベントハンドラを割り当てるために生成されたコードでのみ指定されています。 –

関連する問題