2015-08-05 4 views
2

Я смущен каким-то кодом, который не должен работать, но, как ни странно, работает, и я знаю, что я просто пропускаю что-то очевидное. Я смотрю на исходный код для рамки Accord.NET, и я скачал ее, и ее компиляция просто прекрасна, но я чем-то смущен. В одной из сборок, называемой Accord.Math, есть файл с именем Indices.cs. Вот определение:Доступ к внутреннему классу из другого Dll-файла

internal static class Indices 
{ 
    // Lots of code 
    // ... 
    // ... 
} 

Вы можете увидеть это на line 35.

В другой сборке, называемой Accord.Statistics, есть файл под названием Tools.cs. В этом файле есть такая строка:

return Accord.Math.Indices.Random(k, n); 

Вы можете увидеть это на line 329.

Я смущен, как эта строка может ссылаться на класс Accord.Math.Indices, так как он обозначен как internal. Я понимаю, что класс, помеченный как internal, может быть доступен только классам, которые находятся в одном DLL-файле. Может кто-нибудь объяснить, как это работает?

ответ

6

Это происходит потому, что в файле AssemblyInfo.cs у вас есть эти атрибуты:

[assembly: InternalsVisibleTo("Accord.Tests.Math, PublicKey=...")] 
[assembly: InternalsVisibleTo("Accord.Tests.MachineLearning,...")] 
[assembly: InternalsVisibleTo("Accord.Tests.Statistics,...")] 
[assembly: InternalsVisibleTo("Accord.Statistics, ...")] 

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

Вы можете прочитать больше о InternalsVisibleToAttribute on MSDN

+0

Просто, когда я думал, что я знал, что каждый трюк в C# книги .... Я понятия не имел, вы могли бы сделать это. Спасибо, что ответили! – Icemanind

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