访问不同程序集中的私有方法c#

时间:2009-05-16 19:45:05

标签: c# namespaces private

这可能是一个愚蠢的问题,因为我可以看到它发生的安全原因......

我有一个许可c#项目,它有一个类,它有一个生成我的许可证密钥的方法。我已将此方法设为私有,因为我不希望任何其他人因为显而易见的原因而调用我的方法

我要做的下一件事就是拥有我的用户界面,这是另一个c#项目中引用许可dll是唯一可以在其自身之外访问此方法的“东西”,这是可能的还是我需要将它移动到同一个项目中,以便它可以编译到同一个dll,我可以访问其成员吗?

  

LicensingProject
  -LicensingClass
  --Private MethodX(GeneratesLicenseKeys)

     

LicensingProject.UI
  -LicensingUiClass
   - 我希望能够成为唯一能够访问MethodX

的类

许可证密钥生成器不仅仅在UI中,这是有原因的,因为许可通过在自身上生成哈希并将其与许可证生成器生成的哈希进行比较来实现。

我不希望所有人都编译到dll,因为我的最终用户不需要UI代码。

我知道,按照常识,私人方法就是这样。我很难过。

4 个答案:

答案 0 :(得分:6)

您可以将其设为内部方法,并使用InternalsVisibleToAttribute为LicensingProject.UI提供对LicensingProject的额外访问权限。

Merhdad关于执法的观点是对与错的同时。如果你没有ReflectionPermission,CLR将阻止你调用你不应该调用的东西 - 但是如果你使用完全可信任的程序集中的反射,你可以调用任何东西。您应该假设潜在的黑客能够在自己的计算机上运行完全受信任的程序集:)

这些都不会阻止某人使用Reflector来反编译您的代码。换句话说,将其设为私有不是真正为您的许可方案添加大量安全性。如果有人真正付出任何努力来打破它,他们可能会这样做。

答案 1 :(得分:2)

publicprivate,...东西只是由编译器强制执行。您可以使用反射来轻松访问它们(假设代码具有所需的权限,这是一个合理的假设,因为他可以完全控制机器)。假设没有人可以称呼它,请不要依赖它。

答案 2 :(得分: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");
    }
}

答案 3 :(得分:1)

Foo.Bar可能保持私密...... 要修复上面的代码,请在DynamicMethod构造函数的末尾添加一个参数:

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

添加true以跳过动态方法的MSIL访问的类型和成员的JIT可见性检查。