Дружественные сборки (C++)
Применимые для выполнения, функция языка дружественных сборок делает типы, в области пространства имен или глобальной области в компоненте сборки расположены в одном или нескольких сборки клиента или .netmodules.
Все среды выполнения
Примечания
(Эта функция языка не поддерживается во всех выполнении).
Среда выполнения Windows
Примечания
(Эта функция языка не поддерживается в Среда выполнения Windows).
Требования
Параметр компилятора: /ZW
Среда CLR
Примечания
Сделать типы в области пространства имен или глобальной области в компоненте сборки расположены на сборку клиента или .netmodule
В компоненте, задайте атрибут сборки InternalsVisibleToAttribute и передайте имя сборки клиента или .netmodule, доступа к типам в области пространства имен или глобальной области в компоненте. Можно указать несколько сборки клиента или .netmodules следует указать дополнительные атрибуты.
В сборке клиента или .netmodule, при ссылке на сборку компонент с помощью #using передайте атрибут as_friend. Если указать атрибут as_friend для сборки, которая не определяет InternalsVisibleToAttribute, создается исключение времени выполнения при попытке получить тип в области пространства имен или глобальной области в компоненте.
Ошибка построения приведет к, если сборка, которая содержит атрибут InternalsVisibleToAttribute нет строгого имени и клиентов, сборка, используется атрибут as_friend действий.
Хотя типы в области пространства имен и глобальной области можно узнать в сборке клиента или .netmodule, специальные возможности члена продолжает действовать. Например, невозможно получить доступ к закрытого члена.
Доступ ко всем типам сборки необходимо явно предоставить. Например, сборка C не имеет доступ ко всей сборке a типов, если сборка C ссылается на сборку B и сборка B имеет доступ ко всем сборки а. типов.
Дополнительные сведения об определении специальных возможностей типов вне сборки см. в разделе видимость типа.
Сведения о том, как в знаком, как задать строгое имя к — сборке, созданной с помощью компилятора Visual C++ см. в разделе Сборки со строгими именами (подписывание сборок) (C++/CLI).
В качестве альтернативы использованию функции дружественных сборок, можно использовать StrongNameIdentityPermission ограничить доступ к отдельным типы.
Требования
Параметр компилятора: /clr
Примеры
В следующем примере определяется компонент, который определяет сборку клиента, имеющим доступ к типам компонент.
// friend_assemblies.cpp
// compile by using: /clr /LD
using namespace System::Runtime::CompilerServices;
using namespace System;
// an assembly attribute, not bound to a type
[assembly:InternalsVisibleTo("friend_assemblies_2")];
ref class Class1 {
public:
void Test_Public() {
Console::WriteLine("Class1::Test_Public");
}
};
В следующем примере кода получить закрытый тип в компоненте.
// friend_assemblies_2.cpp
// compile by using: /clr
#using "friend_assemblies.dll" as_friend
int main() {
Class1 ^ a = gcnew Class1;
a->Test_Public();
}
Output
Class1::Test_Public
В следующем примере определяется компонент, но не указывает сборку клиента, которая будет иметь доступ к типам компонент.
Обратите внимание, что компонент связан с помощью /opt:noref. Это гарантирует, что закрытым типам выдаются в метаданные компонента, не требуется, если атрибут InternalsVisibleTo будет присутствовать. Для получения дополнительной информации см. Параметр /OPT (оптимизация).
// friend_assemblies_3.cpp
// compile by using: /clr /LD /link /opt:noref
using namespace System;
ref class Class1 {
public:
void Test_Public() {
Console::WriteLine("Class1::Test_Public");
}
};
В следующем примере кода определяется клиент, который пытается получить закрытый тип в компоненте, не предоставляет доступ к его закрытым типам. Из-за расширения функциональности выполнения, если требуется перехватывать исключение, необходимо попытаться получить закрытый тип во вспомогательной функции.
// friend_assemblies_4.cpp
// compile by using: /clr
#using "friend_assemblies_3.dll" as_friend
using namespace System;
void Test() {
Class1 ^ a = gcnew Class1;
}
int main() {
// to catch this kind of exception, use a helper function
try {
Test();
}
catch(MethodAccessException ^ e) {
Console::WriteLine("caught an exception");
}
}
Output
caught an exception
В следующем примере кода показано, как создать компонент строгого имени, определяющий сборку клиента, которая будет иметь доступ к типам компонент.
// friend_assemblies_5.cpp
// compile by using: /clr /LD /link /keyfile:friend_assemblies.snk
using namespace System::Runtime::CompilerServices;
using namespace System;
// an assembly attribute, not bound to a type
[assembly:InternalsVisibleTo("friend_assemblies_6, PublicKey=00240000048000009400000006020000002400005253413100040000010001000bf45d77fd991f3bff0ef51af48a12d35699e04616f27ba561195a69ebd3449c345389dc9603d65be8cd1987bc7ea48bdda35ac7d57d3d82c666b7fc1a5b79836d139ef0ac8c4e715434211660f481612771a9f7059b9b742c3d8af00e01716ed4b872e6f1be0e94863eb5745224f0deaba5b137624d7049b6f2d87fba639fc5")];
private ref class Class1 {
public:
void Test_Public() {
Console::WriteLine("Class1::Test_Public");
}
};
Обратите внимание, что компонент должен определять его открытого ключа. Рекомендуется ознакомиться, которые последовательно выполните следующие команды в командной строке создать пару ключей и получить открытый ключ:
sn -d friend_assemblies.snk
sn -k friend_assemblies.snk
sn -i friend_assemblies.snk friend_assemblies.snk
sn -pc friend_assemblies.snk key.publickey
sn -tp key.publickey
В следующем примере кода получить закрытый тип в компоненте строгого имени.
// friend_assemblies_6.cpp
// compile by using: /clr /link /keyfile:friend_assemblies.snk
#using "friend_assemblies_5.dll" as_friend
int main() {
Class1 ^ a = gcnew Class1;
a->Test_Public();
}
Output
Class1::Test_Public