Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将代码重新分解为帮助器类以避免重复,但同时又不影响安全性_C#_.net_Visual Studio 2010_.net 4.0 - Fatal编程技术网

C# 将代码重新分解为帮助器类以避免重复,但同时又不影响安全性

C# 将代码重新分解为帮助器类以避免重复,但同时又不影响安全性,c#,.net,visual-studio-2010,.net-4.0,C#,.net,Visual Studio 2010,.net 4.0,和许多人一样,我有一个.NET解决方案,其中包含许多项目 问题是: 我在项目中重复使用了一些代码行。这是一种复制粘贴,我真的很讨厌 我的想法是将所有这些代码移入一个单独的helper类,但以下问题阻碍了这一想法: 安全方面-->当我将此代码移出项目时,这意味着仍有人可以访问它。如果它在我的项目中,我可以通过将相关函数设置为“私有”来提供安全性 因此,问题是如何避免代码重复,同时安全地执行它? 一些代码可以解释我的担忧: 项目A(解决方案S) 项目B(解决方案S) 相反,在helper类中移动此函

和许多人一样,我有一个.NET解决方案,其中包含许多项目

问题是:

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

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

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

因此,问题是如何避免代码重复,同时安全地执行它?

一些代码可以解释我的担忧:

项目A(解决方案S)

项目B(解决方案S)

相反,在helper类中移动此函数,但如何使其安全


(次要细节:我在VS2010中使用.NET版本4)

也许这是正确的方向:


您是否可以使用继承并将“helper”类作为需要它的类的基础

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
  }
}
在另一个组件中:

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
  }
}
然后在包含
Helper
的程序集中使用Assembly属性,允许需要查看
Helper
的程序集访问它


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

这可能是一个解决方案:

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

    [assembly:InternalsVisibleTo(“Full.assembly.Name.Here,PublicKey=”在此处剪切并通过项目A的公钥>”)

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

签署该项目:

  • 调用Sn.exe Sn.key的结果
  • 将sn.key添加到项目中
  • 打开要签名的项目的属性(Alt+Enter)
  • 转到“签名”选项卡
  • 选中复选框“在组件上签名”
  • 在组合框中选择强名称键
  • 编制项目

现在项目已签名,您可以通过使用内部类将InternalsVisibleTo属性添加到项目的AssemblyInfo中,从而使内部构件在其他项目中可见。

您可以详细说明希望在帮助器中放置的代码类型吗?我不知道,但不知道具体的代码,但我觉得可以通过将其更好地封装在适当的对象中来解决。@DirkBoer:我有一些业务逻辑代码在其中。你似乎有一个奇怪的安全概念。在大多数应用程序中,
private
对安全性没有任何影响。它只在混合信任的应用程序中起作用,在这些应用程序中,你沙箱了一些不受信任的代码。谢谢alex。'Inte“rnal”似乎还可以。但是,你能给我解释一下关于“签署项目”的更多内容吗(你回答的第二点。感觉很难理解它。请详细说明]@nowhohommustnotbenamed。我添加了一些额外的ino。希望,这能帮助你从签名开始。感谢你对工具和反射API的启发。但是,你能告诉我为什么你选择继承而不是helper类吗?有什么特别的优势吗或者我,助手类可以,而不是继承!