问题标签 [internalsvisibleto]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
556 浏览

silverlight - Silverlight 安全性:授予对类库访问匿名类的权限

我正在将现有的类库移植到 Silverlight。我经常使用 lambda 表达式编译,现在我正因为它而遇到安全问题。

特别是,如果来自客户端 SL 应用程序的匿名类参与 lambda 表达式,我无法编译它:我得到一个MethodAccessException带有以下堆栈跟踪的:

我尝试InternalsVisibleTo在客户端 SL 应用程序中使用向我的类库公开匿名类,但它没有帮助。实际上它应该有帮助,但我不明白为什么它没有。

有任何想法吗?

更新
我发现问题不在于 lambda 表达式,而在于动态泛型方法调用:

如果我们在类库中有以下代码:

我们从应用程序中调用 StaticReceive 方法,如下所示:

它工作正常,但如果我们使用DynamicReceive,它会失败。看起来 CLR 将方法中的x参数Process视为 type InternalClass,而不是 generic T,并且由于InternalClass库无法访问,因此禁止其调用。

它看起来像一个错误,不是吗?

0 投票
1 回答
1267 浏览

msbuild - 使用 MSBuild 社区任务为 InternalsVisibleTo 设置程序集信息

我正在使用 MSBuild 社区任务根据我的 Subversion 存储库标记自动更新我的程序集版本号。我已将以下内容添加到我的项目文件中:

这给了我一个新的 AssemblyInfo.cs 文件:不幸的是,我需要添加以下内容才能让我的 MStests 正常工作:

[程序集:System.Runtime.CompilerServices.InternalsVisibleTo("XLComponentsUnitTests")]

但我无法弄清楚如何做到这一点 - 例如,似乎无论如何都没有通过 MSBuild 社区任务。任何人都可以提供这方面的指导吗?

0 投票
3 回答
2893 浏览

.net - 什么时候应该使用 [assembly: InternalsVisibleTo()]?

我了解InternalVisibleTo属性用于将具有内部访问修饰符的类型和方法公开给指定的程序集。我只使用它来将内部方法暴露给包含一套单元测试的单独程序集。

我正在努力考虑应该使用它的另一种情况。这个属性是专门为了帮助单元测试而引入的,还是有其他原因?

0 投票
2 回答
9571 浏览

c# - InternalsVisibleTo 属性不起作用

在我继续之前,我确实通过了这个 InternalsVisibleTo 属性不起作用!

因此标题

好的,所以我有一个使用类似以下内容的项目的工作版本。

在 Properties/AssemblyInfo.cs 文件中包含我想要访问的内部内容。在检查它之前它正在工作。但是在 Team Foundation IDK WTF 如此合并之后是错误的,但它就像我的 AssemblyInfo.cs 没有看到该属性,但我验证文件中没有任何更改,但我仍然收到"innaccessable due to its protection level."错误。(伽马辐射?太阳黑子?那些训练错误将工作代码转换成不工作代码的邪恶小精灵哈哈)

我尝试使用反射添加单个实例...

当我尝试这个时,我得到'Stuff.Internal.AssemblyWithIdentifer' is inaccessible due to protection level.

否则,如果我注释掉与内部内容有关的任何内容,我的项目编译得很好。

我用 Red Gates Reflector 仔细检查了我的“PublicKey”

而且我也尝试过使用 privateObjects 以这种方式访问​​方法,但无论我如何尝试,我都无法实例化任何内部的东西。

我也尝试过简单地添加一个新项目,编译它任何引用,是的,确实有效,但之后我尝试创建一个新项目并在“Stuff.Test.Support”项目中添加所有东西以包含引用等和将其添加到我希望访问的项目中的 AssemblyInfo.cs 中,但是,一旦我尝试编译,我就会得到同样的错误"innaccessable due to its protection level."

编辑: 我确实忘记提及我正在使用全局管理程序集的 sharedAssembly.cs 并且具有以与assembly: InternalsVisibleTo我在此问题开头显示的示例属性类似的方式设置的多个属性。如果我的示例没有突出显示,我也会使用强命名程序集。

0 投票
1 回答
492 浏览

c# - InternalsVisibleTo - 在 ascx/aspx 文件中不起作用

我为朋友程序集设置了 InternalsVisibleTo 属性。在控制器中,我可以访问内部类,但如果我尝试在 aspx/ascx 文件中执行相同操作 - "class is inaccessible due to its protection level" 。

有什么办法可以解决这个问题吗?

编辑

我应该让事情更清楚,并指定该属性用于生成设计器类 Internal 的资源文件。我刚刚发现我可以在编辑 resx 文件时更改访问修饰符。

但感谢 Darin Dimitrov 的解释。

0 投票
2 回答
193 浏览

c# - 在外部引用和存储强名称以供重用

我有很多程序集将InternalsVisibleToAttribute设置为指向同一解决方案中的一个特定程序集。不幸的是,被指向的程序集有一个强名称,所以我总是必须一遍又一遍地将相同的公钥令牌放入 AssemblyInfo.cs 文件中。由于 c# 中没有预编译器,我将如何理想地消除这种冗余。

0 投票
1 回答
366 浏览

wpf - InternalsVisibleTo 不适用于 wpf 应用程序

我在另一个程序集中设置了 [assembly:InternalsVisibleTo("GuiAssembly")] 但是当 wpf 绑定发生在另一个程序集中的类上时,它会抛出异常,因为该类中的属性是内部的。

我知道这适用于其他应用程序,但不确定为什么它不适用于这个特定的 WPF 应用程序。

0 投票
3 回答
323 浏览

.net - 发布类库源,不签署密钥文件,但单元测试需要访问内部类,怎么办?

情况如下:

  1. 我想将完整的源代码发布到类库
  2. 我也想发布二进制文件,由我签名,带有我不想发布的密钥文件
  3. 我将提供批处理文件和预构建步骤,如果不存在,它们会在本地创建一个新的密钥文件,以便任何人都可以快速开始使用源代码
  4. 测试项目需要引用主项目中的一个内部类
  5. 要访问内部类,我需要[assembly: InternalsVisibleTo("...")]在主项目 AssemblyInfo.cs 文件中添加一个属性
  6. 由于我正在签署项目输出,因此我需要指定该属性的 PublicKey 部分
  7. 然后这将绑定到我不愿意发布的密钥文件

那么,我该如何解决呢?

如果我对主项目输出而不是测试库进行签名,并且在InternalsVisibleTo属性中仅指定程序集名称,则会收到以下编译时错误:

错误 1 ​​朋友程序集引用“Mercurial.Net.Tests”无效。强名称签名的程序集必须在其 InternalsVisibleTo 声明中指定一个公钥。C:\Dev\VS.NET\Mercurial.Net\Mercurial.Net\Properties\AssemblyInfo.cs 22 31 Mercurial.Net

所以显然不签署测试项目输出是不够的。

我唯一的选择是删除签署项目的设置,并将项目文件修改为我的二进制文件构建脚本的一部分吗?IE。在构建之前寻找<SignAssembly>false</SignAssembly>项目文件的元素并对其进行修改?

0 投票
1 回答
1594 浏览

c# - InternalsVisibleTo 用于动态生成的程序集,但具有强命名

我有一个使用动态代码生成来创建代理类的项目。这个代理类利用了项目的内部类(这样就不会暴露实现细节),所以我使用 InternalsVisibleTo 和我动态生成的程序集的名称。直到最近,当我的客户强制要求所有已发布的程序集都必须具有强名称时,这才正常工作。

出现问题的原因是,为了将 InternalsVisibleTo 与强名称程序集一起使用,它引用的程序集也必须是强名称的,并且您必须提供公钥。我遇到困难的地方是如何为动态生成的程序集提供一个强名称。这是我到目前为止所做的:

  1. 我已经为动态程序集创建了一个新的密钥对,以便 .snk 可以随产品一起提供(显然我们不想提供 .snk 用于对项目程序集的其余部分进行签名。)
  2. 我已经提取了 PublicKey 并更新了 InternalsVisibleTo 以将新的动态 PublicKey 用于动态引用的程序集。
  3. 我试图像这样签署动态生成的程序集:

    /li>

不幸的是,这不起作用,我一直很难找到任何关于它应该如何工作的文档。有谁知道如何签署动态生成的程序集,以便可以通过 InternalsVisibleTo 对其进行访问?我可以将必要的类公开,但最终会泄漏最好封装的实现细节。

0 投票
4 回答
6310 浏览

c# - UnityContainer 和内部构造函数

我有一个带有内部构造函数的类,并希望从 Unity (2.0) 中解决它。

那我在做

当我这样做时,我有一个例外

IService 已注册,唯一的问题是构造函数是内部的。我真的希望这个类是公开的,但我希望它只能通过一个工厂(我实际上在其中调用container.Resolve<MyClass>())来创建。

有没有办法让 Unity 看到内部构造函数?像 InternalsVisibleTo 什么的?