2016-08-27 1 views
0

Visual Studio 2015(C#、WPF)でできるだけ小さなソリューションを作成して、別のアセンブリから1つのアセンブリの内部クラスにアクセスしました。Visual Studio 2015のC#での符号なしフレンドアセンブリ

これまでのところ、運がありません。

MainWindow.xaml.cs

using System.Windows; 
using System.Runtime.CompilerServices; 

[assembly: InternalsVisibleTo("FriendAssemblyTestLibrary")] 

namespace FriendAssemblyTest 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      GlobalData.Member = "hi"; // this works fine 
     } 
    } 
} 

GlobalData.cs

namespace FriendAssemblyTest 
{ 
    internal static class GlobalData 
    { 
     internal static string Member { get; set; } 
    } 
} 

Class1.csの

namespace FriendAssemblyTestLibrary 
{ 
    public class Class1 
    { 
     public Class1() 
     { 
      GlobalData.Member = ""; // this generates: "The name 'GlobalData' does not exist in the current context" 
     } 
    } 
} 

溶液FriendAssemblyTestであり、FriendAssemblyTestとFriendAssemblyTestLibrary(Class Library)という2つのプロジェクトが含まれています。 https://drive.google.com/open?id=0Bwmvskxz-sI1TTBzamQ0WEpLTUE

私のために混乱ビットは、/アウトコンパイラオプションを設定するには、Visual Studioの2015年に可能表示されませんでしたが、友人の組立:

必要な場合

、アップzip形式のソリューションは、こちらからダウンロードできます例はこれが必要であったと主張するように見えた。

誰でも自分の道を送ることができれば助かります。

ありがとうございました! トム

+1

何が問題になるのですか?コードを表示しましたが、「これによってエラーが発生します」よりも具体的なものは教えられませんでした。 (私たちに示した 'Class1.cs'は' FriendAssemblyTest'名前空間のためのディレクティブを持っていません - 少なくともあなたが私たちに示したものではありません) –

+0

すみません、 - "名前 'GlobalData'は現在のコンテキストに存在しません"。 – CINCHAPPS

+1

これは、ライブラリプロジェクトがテストプロジェクトを参照しているときにコンパイルする必要があります。しかし、ネームライブラリはそれが間違った依存関係であることを示唆しています。 –

答えて

0

回答いただきました皆様、ありがとうございます。

私は最終的に "グローバル変数"のジレンマを解決したと思います(これまでに何度も解決されていると確信しています:))。

スーパークールなものは何もありませんが、ソリューションに型付けされたグローバル変数を保存するための適切な出発点を望む人にとっては非常に重要です。

私はグローバルデータクラス用の第3のプロジェクトを作成し、それを配線して、循環参照の問題を回避しました。

MainWindow.xaml.cs

using System.Windows; 

using FriendAssemblyTestLibrary; 

namespace FriendAssemblyTest 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 

      GlobalData.GlobalData.Member = "hi"; 
      GlobalData.GlobalData.TestDecimal = 3.67M; 

      var x = new Class1(); 
     } 
    } 
} 

GlobalData.csここ

namespace GlobalData 
{ 
    public static class GlobalData 
    { 
     public static string Member { get; set; } 
     public static decimal TestDecimal { get; set; } 
    } 
} 

Class1.csの

namespace FriendAssemblyTestLibrary 
{ 
    public class Class1 
    { 
     public Class1() 
     { 
      GlobalData.GlobalData.Member = ""; 
      GlobalData.GlobalData.TestDecimal = 7.6M; 
     } 
    } 
} 

ゾルであります凡例:https://drive.google.com/open?id=0Bwmvskxz-sI1czVaTzRNUTBKdG8

完全性のために、ここではグローバル変数の長所と短所を説明するURLリファレンスを示します。

http://c2.com/cgi/wiki?GlobalVariablesAreBad

私にはかなり良い資源であるように思われます。

+3

Hmya、実際のプログラムで3番目のアセンブリを使用するときに、[InternalsVisibleTo]をいくつ追加すればいいですか?たぶん、真実を語り始める時が来ました。それは、アヒルのように見え、アヒルのように突き刺さって、アヒルのように泳ぐと、それは公に世界的なアヒルです。 –

+0

はい、あなたは絶対に正しいです。私はその後、[assembly]行を削除し、内部をpublicに変更しました。それは私の必要性を満たし、それを清潔にします、ありがとう! – CINCHAPPS

+0

ここで重要な点は、パブリックグローバルデータがアンチパターンであることです。この「機能」とあなたの解決策は避けるべきです。 –

関連する問題