【问题标题】:How to access a Friend method from a Module or Class Web File如何从模块或类 Web 文件访问 Friend 方法
【发布时间】:2021-10-30 23:22:50
【问题描述】:

我正在开发一个 VB.NET ASP.NET 网站。我希望能够限制 Friend 访问我在所有页面中使用的方法之一。

当我这样做时,无论是在模块中还是在 VB 类 Web 文件中(在我的 App_Code 项目文件夹中),我都看不到它。我收到错误 [method] 在此上下文中不可访问,因为它是“朋友”。

从我的所有研究看来,这是因为 bin 被安排到许多不同的 DLL 中 - 一对用于 App_Web_####,一个用于 App_Code。

我尝试将此文件移出 App_Code 文件夹并将其置于其余文件的级别(与页面相同),但我无法从那里引用它。

我考虑在模块/类的顶部指定以下内容,但由于 App_Web_#### 似乎不确定,我无法可靠地使用某些东西。

Imports System.Runtime.CompilerServices
<Assembly: InternalsVisibleTo("AssemblyB")>

编辑:我正在尝试在 Visual Studio 15 中执行此操作

必须有一种方法可以从模块或类文件中引用 Friend 方法。还有其他建议吗?

【问题讨论】:

    标签: asp.net vb.net access-modifiers


    【解决方案1】:

    来自this微软参考页面:

    编译到同一个程序集的其他类、结构和模块中的代码可以访问该程序集中的所有 Friend 元素。

    编译的类库(又名 DLL)被认为是独立的程序集,因此您必须声明您希望外部代码可以访问的元素 - 即使在同一个应用程序中 - 就像 Public 一样,并添加对该代码的库。

    尽管您似乎应该能够从同一应用程序中的其他程序集访问 Friend 元素,但我认为编译器无法区分使用库的同一应用程序和这样做的第三方应用程序。我很想听听其他人对此有何看法。

    【讨论】:

    • 如果使用AssemblyInfo.vbAssemblyInfo.cs 文件中的Assembly:InternalsVisibleToAttribute 正确公开其他程序集中的朋友成员,则可以访问它们。
    • @MikeHofer 好的,我的立场是正确的,并且学到了一些可以尝试的东西,因为我们所有的应用程序也都在不同的程序集之间拆分。如果此方法有任何问题,我会回复。
    • @MikeHofer 已确认。您可以将指令添加到类、等代码文件等或AssemblyInfo 文件(我的偏好)。值得投反对票来了解这一点,因为它有助于混淆(ish)我们的一些代码。谢谢。
    【解决方案2】:

    InternalsVisibleTo 必须位于包含要公开的 Friend 方法的程序集中,并且它必须命名要公开这些成员的程序集。

    话虽如此,InternalsVisibleTo 不能仅限于单个成员:这是全有或全无的事情。

    发生的情况是您的代码被拆分为两个不同的程序集,而您不知道第二个程序集的名称;它是在编译时生成的。如果该名称在构建之间保持不变,您可以通过在运行时检查程序集(通过对象浏览器)来确定它。一旦知道程序集名称,就可以使用它来正确公开内部成员。

    【讨论】:

    • 我们通常对我们的程序集进行签名,其中还需要消费程序集的PublicKey。例如,&lt;Assembly: InternalsVisibleTo("My.Consuming.Friend, PublicKey=00743090048...")&gt;。你会发现,如果你嘴巴正确,VS会自动插入这个。
    • 谢谢迈克。是的,问题是,后面的代码有两个 DLL。它们以 App_Web_#### 格式命名,其中后缀是字母和数字的组合。不清楚这个后缀是怎么产生的,每次去编译或者发布,后缀都会变。
    • @JasonPSallinger 很不幸。您可以通过创建另一个具有固定名称的类库程序集来解决此问题,并重构您的解决方案,以便当前位于 App_Code 中的代码位于此新程序集中。这样,程序集名称不会在构建之间更改。这需要一些工作,但如果您保留命名空间名称,它应该不会太具有挑战性,并且应该可以轻松解决您的问题。
    • 好的,我可能会在时间允许的情况下尝试一下。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 2018-12-10
    • 2015-10-14
    • 1970-01-01
    • 2012-04-09
    相关资源
    最近更新 更多