12

C#で名前空間とともにアセンブリを指定する方法はありますか?

たとえば、プロジェクトでPresentationFramework.Aeroとの両方を参照するとPresentationFramework.Luna、両方が同じ名前空間で同じコントロールを共有しているが、実装が異なることに気付くかもしれません。

例を挙げてみましょうButtonChrome。名前空間の下の両方のアセンブリに存在しますMicrosoft.Windows.Themes

XAML では名前空間と共にアセンブリを含めるので、ここでは問題ありません

xmlns:aeroTheme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"
xmlns:lunaTheme="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Luna"

<aeroTheme:ButtonChrome ../>
<lunaTheme:ButtonChrome ../>

ButtonChromeしかし、C# コード ビハインドでは、 inのインスタンスを作成する方法がとにかく見つかりませんPresentationFramework.Aero

次のコードでは、コンパイル時にエラー CS0433が表示されます

using Microsoft.Windows.Themes;
// ...
ButtonChrome buttonChrome = new ButtonChrome();

エラー CS0433 : タイプ 'Microsoft.Windows.Themes.ButtonChrome' は両方
の 'c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\Profile\Client\PresentationFramework.Aero.dll'に存在します
および
「c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\Profile\Client\PresentationFramework.Luna.dll」

これは非常に理解できます。コンパイラーは、ButtonChrome私が指示していないため、どちらを選択するかを知る方法がありません。どうにかしてそれを行うことはできますか?

4

3 に答える 3

10

アセンブリ参照のエイリアスを指定してから、エイリアスを介してインポートする必要があります。

extern alias thealias;

リファレンスについては、プロパティ ウィンドウを参照してください。

aero アセンブリに「aero」、luna アセンブリに「luna」というエイリアスを設定するとします。次のように、同じファイル内で両方のタイプを操作できます。

extern alias aero;
extern alias luna;

using lunatheme=luna::Microsoft.Windows.Themes;
using aerotheme=aero::Microsoft.Windows.Themes;

...

var lunaButtonChrome = new lunatheme.ButtonChrome();
var aeroButtonChrome = new aerotheme.ButtonChrome();

詳細については、 extern エイリアスを参照してください。

于 2012-06-08T21:39:30.030 に答える
6

レスキューの外部エイリアス。ここのドキュメントを参照してください。アセンブリ参照を追加し、それぞれの参照プロパティにエイリアスLunaとAeroを作成したら、次のサンプルコードを試すことができます。

extern alias Aero;
extern alias Luna;

using System.Windows;

namespace WpfApplication1
{
  /// <summary>
  /// Interaction logic for MainWindow.xaml
  /// </summary>
  public partial class MainWindow: Window
  {
    public MainWindow()
    {
      InitializeComponent();

      var chrome1 = new Luna::Microsoft.Windows.Themes.ButtonChrome();
      var chrome2 = new Aero::Microsoft.Windows.Themes.ButtonChrome();
      MessageBox.Show(chrome1.GetType().AssemblyQualifiedName);
      MessageBox.Show(chrome2.GetType().AssemblyQualifiedName);
    }
  }
}
于 2012-06-08T21:49:54.720 に答える
1

この属性も定義する Microsoft.Scripting アセンブリを参照するときに、 System.NonSerializedAttributeに関する同様のエラーに遭遇しました (サービス参照によって生成された Reference.cs ファイルに衝突が見つかりました)。これを解決する最も簡単な方法は、エイリアスを定義するのと非常に似ていますが、コンパイルの問題はありません。

Visual Studio で、プロジェクトの参照に移動し、競合を生成しているアセンブリの 1 つを選択し、プロパティに移動して、Aliases 値にglobalと等しくないものを入力します。

于 2015-07-06T11:36:57.333 に答える