2016-08-27 2 views
0

Я создал наименьшее возможное решение в Visual Studio 2015 (C#, WPF) для доступа к внутреннему классу в одной сборке из другой сборки.Сборка неподписанного друга в C# в Visual Studio 2015

До сих пор не повезло.

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 и содержит 2 проекта, FriendAssemblyTest и FriendAssemblyTestLibrary (Библиотека классов).

При необходимости, застегнули решение доступно для загрузки здесь: https://drive.google.com/open?id=0Bwmvskxz-sI1TTBzamQ0WEpLTUE

Запутанные немного для меня было это не представляется возможным в Visual Studio 2015 для установки опции компилятора/выхода, но друг сборки примеры, казалось, настаивали на том, что это необходимо.

Я ценю любую помощь, которую каждый может отправить мне.

Спасибо! Том

+1

Так что пошло не так?Вы показали какой-то код, но не сказали нам ничего более конкретного, чем «это порождает ошибку». («Class1.cs», который вы нам показали, не имеет директивы по использованию для пространства имен «FriendAssemblyTest», с одной стороны, по крайней мере, не того, что вы нам показали.) –

+0

К сожалению, я должен был включить это: - «Имя« GlobalData »не существует в текущем контексте». – CINCHAPPS

+1

Это должно скомпилироваться, когда проект библиотеки __references__ проекта Test. Однако библиотека имен предполагает, что это неправильная зависимость. –

ответ

0

Спасибо всем, кто ответил.

Я думаю, что я окончательно решил дилемму «глобальной переменной» (я уверен, что она была решена много раз раньше :)).

Ничего супер-крутого или ничего, но очень важно для тех, кто хочет достойную отправную точку для хранения типизированных глобальных переменных в своих решениях.

Я создал третий проект для глобального класса данных и подключил его таким образом, чтобы избежать проблемы с круговой ссылкой.

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, сколько еще [InternalsVisibleTo] вы собираетесь добавить, когда собираетесь использовать эту третью сборку в реальной программе? Может быть, пришло время начать говорить правду. Когда это выглядит как утка и шарлатанцы, как утка, и плавает, как утка, тогда это общедоступная глобальная утка. –

+0

Да, вы абсолютно правы. С тех пор я удалил строки [сборка] и изменил внутреннюю на публичную. Это удовлетворяет мою потребность и делает ее чище, спасибо! – CINCHAPPS

+0

Главное, что общедоступные глобальные данные являются анти-шаблонами. Эта «функция» и ваше решение следует избегать. –

Смежные вопросы