Pregunta

Esto puede ser una pregunta tonta que he podido ver el motivo de seguridad para que suceda la manera que lo hace ...

Tengo un proyecto de licencia # c, esto tiene una clase que tiene un método que genera mis claves de licencia. He hecho este método privado, ya que no quiero a nadie más para poder llamar a mi método por razones obvias

La siguiente cosa que quiero hacer es tener mi interfaz de usuario, que se encuentra en otro proyecto de C #, que hace referencia a la DLL de licencia para ser la única otra 'cosa' que se puede acceder a este método fuera de sí mismo, es esto posible o ¿es necesario para moverlo en el mismo proyecto, de modo que todo se compila en el mismo archivo DLL y que puede acceder a sus miembros?

  

LicensingProject
  -LicensingClass
  , Correspondiente a los MethodX (GeneratesLicenseKeys)

     

LicensingProject.UI
  -LicensingUiClass
  --Yo quiero ser capaz de ser la única clase de poder acceder a la MethodX

Hay una razón por la cual el generador de clave de licencia no es sólo en la interfaz de usuario, que se debe a las obras de concesión de licencias mediante la generación de un hash sobre sí mismo y lo compara con el generado por el generador de licencia.

Yo preferiría no a todos compilar la DLL como mis usuarios finales no necesitan el código de interfaz de usuario.

Sé que por el sentido común un método privado, es sólo eso. Estoy confundido.

¿Fue útil?

Solución

Se puede hacer que sea un método interno, y el uso de InternalsVisibleToAttribute para dar LicensingProject.UI acceso adicional a LicensingProject.

punto de Merhdad sobre la aplicación está bien y mal al mismo tiempo. Si usted no tiene ReflectionPermission , CLR le impide llamar a las cosas que usted no debe - pero si usted está utilizando la reflexión de un montaje totalmente de confianza, puede llamar a cualquier cosa. Usted debe asumir que un hacker potencial es capaz de ejecutar un montaje totalmente confiado en su propia máquina:)

Nada de esto se detendrá a alguien de usar Reflector descompilar el código. En otras palabras, lo que es privado no es realmente añadir una cantidad significativa de seguridad a su sistema de licencias. Si alguien realmente pone ningún esfuerzo en romperlo, probablemente van a estar capaz de hacerlo.

Otros consejos

Este es realmente un comentario , en respuesta a la observación del Mehrdad sobre el tiempo de ejecución no realizar comprobaciones de acceso; Aquí, se puede ver el JIT (transpira) llevar a cabo la comprobación de acceso -. No reflexión, y no el compilador de C #

Para corregir el código, hacer Foo.Bar pública. Curiosamente, también verifica que Foo es accesible - así que <=> interna para ver más fuegos artificiales:

using System;
using System.Reflection;
using System.Reflection.Emit;
static class Program {
    static void Main() {
        MethodInfo bar = typeof(Foo).GetMethod("Bar",
            BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
        var method = new DynamicMethod("FooBar", null, new[] {typeof(Foo)});
        var il = method.GetILGenerator();
        il.Emit(OpCodes.Ldarg_0);
        il.EmitCall(OpCodes.Callvirt, bar, null);
        il.Emit(OpCodes.Ret);

        Action<Foo> action = (Action<Foo>) method.CreateDelegate(typeof(Action<Foo>));
        Foo foo = new Foo();
        Console.WriteLine("Created method etc");
        action(foo); // MethodAccessException
    }
}

public class Foo {
    private void Bar() {
        Console.WriteLine("hi");
    }
}

public, private, ... cosas apenas están forzadas por el compilador. Se puede utilizar la reflexión para tener acceso a ellos con bastante facilidad (suponiendo que el código ha requerido permisos, lo cual es una suposición razonable ya que tiene un control completo de la máquina). No confíe en que nadie puede asumir llamarlo.?

Foo.Bar puede permanecer privada ... Para solucionar el código anterior, añadir un parámetro al final de la DynamicMethod constructor:

var method = new DynamicMethod("FooBar", null, new[] {typeof(Foo)}, true);

Añadir verdadera para saltar cheques de visibilidad JIT en tipos y miembros que accede el MSIL del método dinámico.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top