2

与许多人一样,我有一个 .NET 解决方案,下面有许多项目。

问题是这样的:

我在我的项目中重复使用了一些代码行。它是一种复制粘贴,我真的很讨厌那个..

我的想法是将所有这些代码移到一个单独的辅助类中,但以下问题阻碍了这个想法:

安全方面 --> 当我将这段代码移出我的项目时,这意味着有人仍然可以访问它。如果它在我的项目中,我可以通过将相关功能设为“私有”来为其提供安全性。

那么,问题是如何避免代码重复,同时又安全地做到这一点

一些代码来解释我的担忧:

项目 A(解决方案 S)

private Foo SomeSecureCode(IMyInterface interfaceObject)
{
     //Same some lines of code
}

项目 B(解决方案 S)

private Foo SomeSecureCode(IMyInterface interfaceObject)
{
    //Same some lines of code as above
}

相反,将这个函数移动到一个辅助类中,但是如何安全地实现它呢?

(次要细节:我使用 .NET 版本 4 和 VS 2010)

4

3 回答 3

3

这可能是一个解决方案:

  • 将类从项目 A 移动到另一个项目 (B) 并使类内部
  • 使用 sn.exe 对不想使用类的项目进行签名,并在项目的属性中对项目进行签名。
  • 在项目 B 中,将此添加到项目 B 的 Properties 文件夹下的 AssemblyInfo 中。

    [程序集:InternalsVisibleTo("Full.Assembly.Name.Here, PublicKey="在此处剪切并过去项目 A 的公钥>")]

现在您只能在项目 A 和 B 中使用它。

签署项目:

  • 运行sn.exe
  • 调用 Sn.exe sn.key 的结果
  • 将 sn.key 添加到您的项目中
  • 打开要签名的项目的属性(Alt+Enter)
  • 转到选项卡“签名
  • 选中复选框“签署程序集
  • 在组合框中选择强名称键
  • 编译项目

现在项目已签名,您可以通过将 InternalsVisibleTo 属性添加到具有内部类的项目的 AssemblyInfo 来使内部在其他项目中可见。

于 2013-08-31T16:55:25.913 回答
1

你可以使用继承并让“帮助”类成为需要它的类的基础吗?

sealed class A : C { }
sealed class B : C { } 
abstract class C { 
    protected Foo SomeSecureCode(IMyInterface interfaceObject); 
} 

您还可以使用对象组合和内部类。

在一个组件中:

class A { 
private Helper _helper; 
  private Foo SomeSecureCode(IMyInterface interfaceObject) { 
    return _helper.SomeSecureCode(interfaceObject); 
  }
}

在不同的程序集中:

internal class Helper { 
  public Foo SomeSecureCode(IMyInterface interfaceObject) { 
    // your code here
  }
}

然后在包含的程序集中使用 Assembly InternalsVisibleTo属性Helper以允许需要查看的程序集Helper访问它。

另外,请记住,使用您的程序集的任何人都可以使用反射 API 访问和调用您的私有方法,而 dotpeek 等工具将让他们看到您的代码,而只会丢失一点点信息。

于 2013-08-31T16:53:49.910 回答
1

也许这指向正确的方向:

InternalsVisibleToAttribute:指定通常仅在当前程序集中可见的类型对指定程序集可见。

于 2013-08-31T16:49:15.110 回答