Pergunta

Esta pode ser uma pergunta idiota quanto eu posso ver a razão de segurança para que isso aconteça da maneira que faz ...

Eu tenho um # projecto de licenciamento c, este tem uma classe que tem um método que gera as chaves de licença. Eu fiz este método privado como eu não quero mais ninguém para ser capaz de chamar o meu método, por razões óbvias

A próxima coisa que eu quero fazer é ter a minha interface do usuário, que é em outro # projeto c que está fazendo referência a dll licenciamento ser a única outra 'coisa' que pode acessar esta fora método de si mesmo, isso é possível ou eu preciso fazer para movê-lo para o mesmo projeto para que ele todos os compila para o mesmo dll e eu posso acessar seus membros?

LicensingProject
-LicensingClass
--Private MethodX (GeneratesLicenseKeys)

LicensingProject.UI
-LicensingUiClass
--Eu quero ser capaz de ser a única classe para ser capaz de acesso MethodX

Há uma razão pela qual a licença Key Generator não é apenas na interface do usuário, que é porque as obras de licenciamento por gerar um hash sobre si mesmo e compara com o gerado pela Licença Generator.

Eu preferiria não a todos compilação para a DLL como meus usuários finais não precisa do código de interface do usuário.

Eu sei que pelo senso comum um método particular, é apenas isso. Estou perplexo.

Foi útil?

Solução

Você poderia torná-lo um método interno, e usar InternalsVisibleToAttribute para dar LicensingProject.UI acesso extra para LicensingProject.

ponto de Merhdad sobre a aplicação é certo e errado ao mesmo tempo. Se você não tem ReflectionPermission , o CLR vai parar de chamar as coisas que você não deve - mas se você estiver usando o reflexo de um totalmente confiável montagem, você pode chamar qualquer coisa. Você deve assumir que um hacker potencial é capaz de executar uma confiança totalmente montagem em sua própria máquina:)

Nada disso vai parar alguém de usar refletor descompilar seu código. Em outras palavras, tornando-privada não é realmente adicionando uma quantidade significativa de segurança para o seu regime de licenciamento. Se alguém realmente coloca qualquer esforço para quebrá-lo, eles provavelmente vai ser capaz de.

Outras dicas

Esta é realmente um comentário , em resposta ao ponto de Mehrdad sobre o tempo de execução não executar verificações de acesso; aqui, você pode ver o JIT (se verificar) realizar a verificação de acesso -. Não reflexão, e não o compilador C #

Para corrigir o código, tornar pública Foo.Bar. Curiosamente, ele também verifica se Foo é acessível - Então faça Foo interno para ver mais fogos de artifício:

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, ... coisas estão apenas forçado pelo compilador. Você pode usar o reflexo para acessá-los muito facilmente (assumindo que o código tenha permissões necessárias, que é uma suposição razoável como ele tem o controle completo sobre a máquina). Não confie em que assumindo ninguém pode chamá-lo.

Foo.Bar pode ficar privado ... Para corrigir o código acima, adicione um parâmetro no final do construtor DynamicMethod:

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

Adicionar verdade para pular verificações de visibilidade JIT sobre tipos e membros acessados ??pelo MSIL do método dinâmico.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top