【问题标题】:restrict add reference for an assembly限制为程序集添加引用
【发布时间】:2011-08-01 14:38:37
【问题描述】:

我有一个包含多个程序集的框架。由于代码的逻辑分离,创建了多个程序集。该框架应该分发给开发人员和最终用户。开发人员应该使用很少的框架程序集来开发他们的模块。但是运行这些模块需要所有其他程序集。在几个程序集中,我希望只有少数程序集可以添加到项目引用中,并限制其他程序集被添加到开发人员项目引用中。换句话说,我希望开发人员不能使用不用于插件开发的程序集中包含的类型。最好的方法是什么?我想避免将某些对象传递给这些程序集中每种类型的构造函数并验证它们。

我可以利用 AppDomain 或任何类似的东西,它标识类型正在由主应用程序或模块创建。如果它不是主应用程序,则抛出异常或不初始化。建议对架构进行任何更改。

【问题讨论】:

    标签: c# visual-studio-2010


    【解决方案1】:

    一种选择是将“受限”程序集中的类型设为内部类型而不是公共类型,然后在这些受限程序集中添加InternalsVisibleToAttribute 以允许从其他“框架”程序集中访问它们。

    这样,最终开发人员仍然可以添加对“受限”程序集的引用(并且可能应该这样做,以确保它们被复制以进行部署)但不会能够使用这些程序集中的任何类型。

    编辑:另一种选择可能是使用 ILMerge 在最后构建 one 程序集 - 所以它是 deployment 的真正单元,即使您最初将其拆分分手原因。

    另一种选择是将所有内容合并到一个项目中,并依靠代码审查、命名空间和常识来发现违反分离的情况。

    【讨论】:

    • 我可以避免在 InternalsVisibleTo 中使用 PublicKey 并且只允许在应用程序目录中使用程序集吗?
    • @hungry:我不知道,不。但这确实是一次性的痛苦。
    • 并将所有程序集(使用 ILMerge)合并为一个程序集,然后将其发送给您的用户。不要用你的内部架构惹恼你的用户。需要包含许多程序集,而所有相关类型都只在一个程序集中对开发人员来说是非常不愉快的。
    • @Steven:具有讽刺意味的是,我刚刚编辑了我的答案以包括 ILMerge :)
    • 属性在运行时没有任何作用,那么它如何允许已知程序集呢?开发人员也可以使用反射来使用我的类型吗?只是好奇?
    【解决方案2】:

    您可以将其他程序集中的所有类型设为internal,以防止它们在定义的程序集之外使用。

    您可以使用[InternalsVisibleTo] attribute 使它们对您的其他程序集可见。

    【讨论】:

    • 是的,但是即使我的程序集也无法访问它。我希望它们只能被框架程序集访问
    • @hungry: 使用[InternalsVisibleTo]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多