2

これは、セキュリティ上の理由がそのように発生することがわかるので、難しい質問かもしれません...

ライセンスc#プロジェクトがあります。これには、ライセンスキーを生成するメソッドを持つクラスがあります。明らかな理由で他の人が自分のメソッドを呼び出せないようにするため、このメソッドをプライベートにしました。

次にやりたいのは、ライセンスdllを参照している別のc#プロジェクトにあるユーザーインターフェイスを、それ自体の外部でこのメソッドにアクセスできる唯一の他の「もの」にすることです。これは可能ですか、それとも必要ですか?すべてが同じdllにコンパイルされ、そのメンバーにアクセスできるように、同じプロジェクトに移動するにはどうすればよいですか?

LicensingProject
-LicensingClass
--Private MethodX(GeneratesLicenseKeys)

LicensingProject.UI
-LicensingUiClass
--MethodXにアクセスできる唯一のクラスになりたい

ライセンスキージェネレーターがUIだけにないのには理由があります。これは、ライセンスがそれ自体でハッシュを生成し、ライセンスジェネレーターによって生成されたものと比較することによって機能するためです。

エンドユーザーはUIコードを必要としないため、すべてをdllにコンパイルすることは避けたいと思います。

私は常識的に私的な方法がまさにそれであることを知っています。私は困惑しています。

4

4 に答える 4

6

これを内部メソッドにしInternalsVisibleToAttributeて、LicensingProject.UIにLicensingProjectへの追加アクセスを与えるために使用できます。

執行についてのマーダッドの主張は、同時に正しいことと間違っていることです。ReflectionPermissionがない場合、CLRは、すべきでないものを呼び出すことを停止しますが、完全に信頼できるアセンブリからのリフレクションを使用している場合は、何でも呼び出すことができます。潜在的なハッカーが自分のマシンで完全に信頼できるアセンブリを実行できると想定する必要があります:)

これは、誰かがReflectorを使用してコードを逆コンパイルするのを妨げるものではありません。言い換えれば、それをプライベートにすることは、ライセンススキームにかなりの量のセキュリティを実際に追加することではありません。誰かが実際にそれを壊すために何らかの努力をするならば、彼らはおそらくそれをすることができるでしょう。

于 2009-05-16T19:48:24.970 に答える
2

public、、private...ものはコンパイラによって強制されます。リフレクションを使用して、それらに非常に簡単にアクセスできます(コードに必要なアクセス許可があると仮定します。これは、彼がマシンを完全に制御しているため、合理的な仮定です)。誰もそれを呼び出すことができないと仮定して、それに依存しないでください。

于 2009-05-16T19:48:15.343 に答える
2

これは、ランタイムがアクセスチェックを実行していないというMehrdadの指摘に応えて、実際にはコメントです。ここでは、アクセスチェックを実行しているJIT(発生)を確認できます。リフレクションではなく、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");
    }
}
于 2009-05-16T20:13:49.090 に答える
1

Foo.Bar は非公開のままになる可能性があります... 上記のコードを修正するには、DynamicMethod コンストラクターの最後に 1 つのパラメーターを追加します。

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

動的メソッドの MSIL によってアクセスされる型とメンバーの JIT 可視性チェックをスキップするには、true を追加します。

于 2011-01-08T07:37:02.513 に答える