異なるアセンブリC#でプライベートメソッドにアクセス
-
22-08-2019 - |
質問
これは...私はそれはそれがない方法を発生するためのセキュリティ上の理由を見ることができるようにばか質問かもしれ
私は、これは私のライセンスキーを生成する方法を持つクラスを持っている、ライセンスC#のプロジェクトを持っています。私は誰が明白な理由のために私のメソッドを呼び出すことができるようにしたくないと私はこの方法で民間行った。
私がやりたい次の事は自身の外でこのメソッドにアクセスすることができる唯一の他の「もの」であるとライセンスのdllを参照している別のC#プロジェクトである私のユーザーインターフェースを有することがある、これは可能ですか私はそれがすべて同じDLLにコンパイルし、私はそのメンバーにアクセスできるように、同じプロジェクトに移動する必要があるのですか?
LicensingProject
-LicensingClass
--Private MethodX(GeneratesLicenseKeys)
LicensingProject.UI
-LicensingUiClass
--IはMethodXにアクセスできるようにする唯一のクラスになることができるようにしたい。
ライセンスキージェネレータは、UIにだけではない理由は、ライセンス自体にハッシュを生成することで動作し、ライセンスジェネレータによって生成された1と比較するため、つまり、あります。
私は、エンドユーザーがUIのコードを必要としないようDLLにコンパイルしていないすべてのことを好むだろう。
私は常識でプライベートメソッドは、まさにそれであることを知っています。私は困惑しています。
解決
あなたはそれを内部メソッド作り、を使用することができますLicensingProject.UIにLicensingProjectへの余分なアクセスを提供するためににInternalsVisibleToAttribute
ます。
執行についてMerhdadのポイントは、同時に右と間違っています。あなたが持っていない場合は ReflectionPermission に、 CLRは、あなたがいけない事を呼び出すからあなたを停止します - しかし、あなたは完全に信頼アセンブリからの反射を使用している場合、あなたは何を呼び出すことができます。あなたは、潜在的なハッカーは自分のマシン上で完全に信頼できるアセンブリを実行することが可能であることを前提とする必要があります)。
これのどれもあなたのコードをコンパイルするために反射するを使用してから誰かを停止することはありません。言い換えれば、それはプライベート作ることはあなたのライセンススキームにセキュリティの重要な量を追加する本当にのではありません。誰もが実際にそれを壊すことに何の努力を入れた場合、彼らはおそらくにできるようになります。
他のヒント
のこれは本当にアクセスチェックを実行していないランタイムについて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");
}
}
public
、private
、...ものは、ただ、コンパイラによって強制されています。あなたは(彼はマシンの完全な制御を持っているとして、合理的な仮定である権限を必要としているコードを、仮定して)かなり簡単にアクセスするためにリフレクションを使用することができます。それを呼び出すことができると仮定すると、誰に依存しないでください。
Foo.Barは、プライベートで滞在可能です... 上記のコードを修正DynamicMethodコンストラクタの端部に一つのパラメータを追加する
var method = new DynamicMethod("FooBar", null, new[] {typeof(Foo)}, true);
動的メソッドのMSILによってアクセスタイプとメンバーにJITの可視性チェックをスキップする真追加します。