문제

이것은 내가하는 방식대로 일어날 보안 이유를 볼 수 있으므로 멍청한 질문 일 수 있습니다 ...

라이센스 C# 프로젝트가 있습니다. 여기에는 라이센스 키를 생성하는 메소드가있는 클래스가 있습니다. 다른 사람이 명백한 이유로 내 방법을 호출 할 수 있기를 원하지 않기 때문에이 방법을 비공개로 만들었습니다.

다음으로하고 싶은 것은 라이센스 DLL이 자체적 으로이 방법에 액세스 할 수있는 유일한 '다른'것 '이라고 언급하는 다른 C# 프로젝트에있는 사용자 인터페이스를 갖는 것입니다. 동일한 프로젝트로 이동하여 모든 DLL에 컴파일하고 회원에 액세스 할 수 있습니까?

LicensingProject
-licensingclass
-private methodx (GeneratesLicenseKeys)

LicensingProject.ui
-licensinguiclass
-나는 methodx에 액세스 할 수있는 유일한 클래스가 될 수 있기를 원합니다.

라이센스 키 생성기가 UI에있는 것이 아니라 라이센스가 해시를 생성하여 라이센스를 생성하여 라이센스 생성기가 생성 한 것과 비교하기 때문입니다.

최종 사용자가 UI 코드가 필요하지 않으므로 모든 DLL을 컴파일하지 않기를 원합니다.

나는 상식에 의해 개인 방법이 바로 그 바로라는 것을 알고 있습니다. 나는 그루칭 받았다.

도움이 되었습니까?

해결책

당신은 그것을 내부 방법으로 만들고 사용할 수 있습니다. InternalsVisibleToAttribute LicensingProject.ui LicensingProject에 대한 추가 액세스를 제공합니다.

집행에 대한 Merhdad의 요점은 동시에 옳고 그른 것입니다. 당신이 없다면 반사 분열, CLR은 당신이하지 말아야 할 것을 부르는 것을 막을 것입니다. 그러나 완전히 신뢰할 수있는 어셈블리에서 반사를 사용하는 경우 무엇이든 전화 할 수 있습니다. 잠재적 해커가 자신의 컴퓨터에서 완전히 신뢰할 수있는 어셈블리를 실행할 수 있다고 가정해야합니다. :)

이 중 어느 것도 누군가가 사용하는 것을 막을 수 없습니다 반사기 코드를 소환합니다. 다시 말해, 개인을 만드는 것은 아닙니다 진짜 라이센스 체계에 상당한 양의 보안을 추가합니다. 누군가가 실제로 그것을 깨기 위해 노력을 기울이면 아마도 가능할 것입니다.

다른 팁

이것은 실제로 의견입니다, 액세스 점검을 수행하지 않는 런타임에 대한 Mehrdad의 요점에 대한 응답으로; 여기서는 JIT (It offistes)가 C# 컴파일러가 아닌 액세스 점검을 수행하는 것을 볼 수 있습니다.

코드를 수정하려면 만들 수 있습니다 Foo.Bar 공공의. 흥미롭게도, 그것은 또한 그것을 확인합니다 Foo 접근 가능합니다 Foo 더 많은 불꽃 놀이를보기위한 내부 :

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, ... 물건은 컴파일러에 의해 단지 시행됩니다. 반사를 사용하여 쉽게 액세스 할 수 있습니다 (코드에 권한이 필요하다고 가정하면 기계를 완전히 제어 할 수 있으므로 합리적인 가정입니다). 아무도 그것을 부를 수 없다고 가정한다고 생각하지 마십시오.

foo.bar는 비공개로 유지 될 수 있습니다 ... 위의 코드를 수정하려면 DynamicMethod 생성자 끝에 하나의 매개 변수를 추가하십시오.

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

TRUE를 추가하여 동적 방법의 MSIL에 의해 액세스 된 유형 및 멤버에서 JIT 가시성 검사를 건너 뜁니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top