Как выставить только один конкретный класс из сборки? - PullRequest
1 голос
/ 27 января 2009

Предположим, сборка Assembly1.dll содержит 3 класса: класс C1, C2, C3.

Я хочу выставить только класс С1 для внешнего мира. Классы C2 и C3 не будут доступны. Как добиться этого?

Примечание. Делать классы C2 и C3 закрытыми нельзя, так как это сделает их недоступными внутри самой сборки.

Ответы [ 7 ]

15 голосов
/ 27 января 2009

Сделать классы C2 и C3 внутренними, как в:

internal class C2
{
//...
}
7 голосов
/ 27 января 2009

Как уже говорили другие, вы используете internal видимость. Еще пара очков:

  • Для не вложенных типов, внутреннее значение по умолчанию в C #, поэтому у вас нет для его указания. Независимо от того, указали ли вы явно доступ по умолчанию, это вопрос личного вкуса. (Я в настоящее время нахожусь на заборе, склоняясь к явному.)

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

5 голосов
/ 27 января 2009

Ключевое слово "internal" указывает, что класс доступен только в пределах его собственной сборки. Возможно, вам следует пометить C2 и C3 этим.

1 голос
/ 27 января 2009

internal это путь. Если вы хотите протестировать ваши классы C2 и C3 из другой сборки, вы можете сделать это, установив атрибут InternalsVisibleTo в вашей сборке.

1 голос
/ 27 января 2009

Вы можете использовать «внутренний» метод доступа вместо «частного», поэтому видимость классов будет ограничена уровнем сборки, а не снаружи.

1 голос
/ 27 января 2009
0 голосов
/ 01 октября 2011

Внутреннее ключевое слово отлично работает, если вы не хотите, чтобы ваши классы были доступны как для COM, так и для .NET вне вашей сборки.

Однако, если вы хотите более точный контроль над тем, что вы предоставляете COM, способ сделать это - оставить ваши классы общедоступными, снимите флажок «Сделать сборку COM видимой» в свойствах проекта (которая изменяет AssemblyInfo.cs под обложками), а затем добавьте атрибут к классу, который вы хотите представить в COM. Примерно так:

[Guid("12338758-70B4-40B7-75FA-50300015DAC9")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class MyClassToExpose
...