Ensamblados de confianza (C++)
Por runtime aplicables, la característica del lenguaje de ensamblado de confianza hace tipos que están en el ámbito de espacio de nombres o el ámbito global en un componente de ensamblado accesible a uno o más ensamblados de cliente o .netmodules.
Todos los runtimes
Comentarios
(Esta característica de lenguaje no se admite en todos los runtimes.)
Windows en tiempo de ejecución
Comentarios
(Esta característica de lenguaje no se admite en Windows en tiempo de ejecución.)
Requisitos
Opción del compilador: /ZW
Common Language Runtime
Comentarios
Para hacer que los tipos en el ámbito o el ámbito global del espacio de nombres en un componente de ensamblado accesible para un ensamblado de cliente o un .netmodule
En el componente, especifique un atributo assembly InternalsVisibleToAttribute, y pase el nombre del ensamblado de cliente o de .netmodule que tendrán acceso a tipos en el ámbito o el ámbito global del espacio de nombres en el componente. Puede especificar varios ensamblados de cliente o .netmodules especificando atributos adicionales.
En el ensamblado de cliente o el .netmodule, cuando haga referencia al ensamblado de componente mediante #using, pase el atributo de as_friend . Si se especifica el atributo de as_friend para un ensamblado que no especifique InternalsVisibleToAttribute, una excepción en tiempo de ejecución se producirá si intenta tener acceso a un tipo en el ámbito de espacio de nombres o el ámbito global en el componente.
Un error de compilación se producirá si el ensamblado que contiene el atributo de InternalsVisibleToAttribute no tiene un nombre seguro pero el cliente que el ensamblado que utiliza el atributo de as_friend .
Aunque los tipos en el ámbito y el ámbito global del espacio de nombres pueden ser conocidos a un ensamblado de cliente o un .netmodule, la accesibilidad del miembro continúa en vigor. Por ejemplo, no puede tener acceso a un miembro privado.
Acceso a todos los tipos en un ensamblado debe explícitamente conceder. Por ejemplo, el ensamblado C no tiene acceso a todos los ensamblados A los tipos de si el ensamblado c hace referencia al ensamblado b y el ensamblado b tiene acceso a todo el ensamblado. de los tipos.
Para obtener información sobre cómo especificar la accesibilidad de tipos fuera de un ensamblado, vea Visibilidad de tipos.
Para obtener información sobre cómo se signo- que es, cómo dar un nombre seguro - uno al ensamblado que se compila con el compilador de Visual C++, vea Ensamblados de nombre seguro (Firma de ensamblados) (C++/CLI).
Como una alternativa a utilizar ensamblados característica, es de confianza puede utilizar StrongNameIdentityPermission para restringir el acceso a los tipos individuales.
Requisitos
Opción del compilador: /clr
Ejemplos
El ejemplo de código siguiente define un componente que especifica un ensamblado de cliente que tiene acceso a los tipos del componente.
// 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");
}
};
El ejemplo de código siguiente tiene acceso a un tipo privado del componente.
// friend_assemblies_2.cpp
// compile by using: /clr
#using "friend_assemblies.dll" as_friend
int main() {
Class1 ^ a = gcnew Class1;
a->Test_Public();
}
Resultados
Class1::Test_Public
El ejemplo de código siguiente define un componente pero no especifica un ensamblado de cliente que tiene acceso a los tipos del componente.
Observe que vinculan al componente mediante /opt:noref. El garantiza que se emitan a los tipos privados en los metadatos del componente, que no es necesaria si el atributo de InternalsVisibleTo está presente. Para obtener más información, vea /OPT (Optimizaciones).
// 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");
}
};
El ejemplo de código siguiente define un cliente que intenta obtener acceso a un private escribir en un componente que no de acceso a los tipos privados. Debido al comportamiento en tiempo de ejecución, si desea detectar la excepción, debe intentar obtener acceso a un tipo privado en una función auxiliar.
// 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");
}
}
Resultados
caught an exception
El ejemplo de código siguiente se muestra cómo crear un componente de nombre seguro que especifica un ensamblado de cliente que tiene acceso a los tipos del componente.
// 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");
}
};
Observe que el componente debe especificar la clave pública. Recomendamos que ejecute los siguientes comandos secuencialmente en un símbolo del sistema para crear un par de claves y obtener la clave pública:
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
El ejemplo de código siguiente tiene acceso a un tipo privado en el componente de nombre seguro.
// 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();
}
Resultados
Class1::Test_Public