问题标签 [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 投票
20 回答
57958 浏览

.net - InternalsVisibleTo 属性不起作用

我正在尝试使用InternalsVisibleTo程序集属性使 .NET 类库中的内部类对我的单元测试项目可见。出于某种原因,我不断收到一条错误消息,上面写着:

'MyClassName' 由于其保护级别而无法访问

两个程序集都已签名,并且我在属性声明中列出了正确的密钥。有任何想法吗?

0 投票
5 回答
3334 浏览

.net - 使用“朋友”声明进行单元测试。馊主意?

[当然,问题不限于特定的“朋友”实现,尽管如果相关,请随时指出实现细节]

阅读未回答的问题,我偶然发现了这个InternalsVisibleTo属性:

指定通常仅在当前程序集中可见的类型对另一个程序集可见。

MSDN上的C# Programming Guide有一节Friend Assemblies描述了如何使用属性来允许对另一个程序集使用方法和类型。internal

我想知道使用它来创建一个“隐藏”接口来检测库以供单元测试程序集使用是否是一个好主意。它似乎在两个方向上都大大增加了耦合(在生产程序集中测试代码,在测试代码中对生产程序集的深入了解),但另一方面,它可能有助于创建细粒度的测试,而不会弄乱公共接口。

你在测试时使用友元声明是什么体验?是你的银弹,还是它开始了死亡行军?

0 投票
2 回答
3215 浏览

.net - InternalsVisibleTo 不适用于托管 C++

InternalsVisibleTo 不适用于我的托管 C++ 项目,但适用于我的 C# 项目。任何帮助,将不胜感激。这是一个简化的布局。

项目A - C#,有一个我想从B/C访问的内部属性。
项目B - 托管 C++。参考文献A。
项目C - C#,引用A

所有项目都使用相同的密钥进行签名。查看使用 ILDASM 或 Reflector 编译的程序集表明它们都已正确签名(当我注释掉内部属性使用时)。

在项目A 的AssemblyInfo.cs 中,我有以下 InternalsVisibleTo;

键是剪切粘贴的,所以我知道它们是正确的。

当我尝试编译时,A & C编译正常,但项目B失败

MSDN 文档说这适用于 C++。是否有错误或其他我需要做的事情?

是否有另一种方法可以保护财产,使其只能由我签名的程序集使用?我知道我可以保护我所有的程序集,但是我可以像这样在粒度级别上做到这一点吗?

编辑

根据 MSDN 中的评论,我将属性更改为以下,但这仍然不起作用。

0 投票
2 回答
2223 浏览

.net - XmlSerializer 和 InternalsVisibleTo 属性

是否可以XmlSerializer通过使用InternalsVisibleTo属性来序列化内部类成员?

如果是,我应该让我的内部组件对哪个组件可见。换句话说,我应该为InternalsVisibleTo属性提供什么程序集名称和公钥。

0 投票
2 回答
2651 浏览

rhino-mocks - 使用 RhinoMocks 模拟内部类

所以我有一堆内部类,我试图用 RhinoMocks 模拟它们。我在 assemblyinfo.cs 中添加了以下行:

但是,这仍然不允许我模拟内部类;我从 NUnit 收到以下错误消息:

MyTests.SomeTest:System.TypeLoadException:来自程序集“DynamicProxyGenAssembly2,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null”的类型“SomeType504cf40be6b444abfd417dccf5d6752”上的方法“SomeMethod”正在覆盖从该程序集中不可见的方法。

请注意,我使用的是 RhinoMocks 的“合并”版本(而不是下载选项“带有 Castle 程序集”)。我不知道 Castle 是如何合并到 RhinoMocks 中的,但不应该让我的内部对 RhinoMocks 可见,同样让它对 Castle 可见(它是 Rhino.Mocks.dll 的一部分)?

0 投票
3 回答
960 浏览

.net - 用于测试私有方法的非代码生成转发 shim

一般来说,我设计类的方式是为了测试目的不需要访问私有数据。安InternalsVisibleTo也可以帮忙。

但是,我目前正在处理一个代码库,该代码库有一些区域已经依赖于 [VSTS 中的私有访问器机制]( http://msdn.microsoft.com/en-us/library/ms184807(VS.80 ).aspx)(即,VSCodeGenAccessors用于生成*_Accessor具有转发的类,这些转发使用反射来调用类上的private成员(以及可选internal的成员)。

所以我有这样的代码:

(是的,充满了反模式——但请不要向信使开枪)

我对此有很多问题:

  1. 我希望能够澄清我需要哪些隐私
  2. 我不想调用对话框(是的,我是一个 CRaholic)
  3. 我不想在图片中涉及代码生成

所以我希望能够将上面的代码转换为:

我的测试程序集中只有以下界面,没有生成代码或自定义构建步骤:-

从那里,我可以使用 CodeRush 或 Ctrl KM 在界面上生成新的阴影方法,只需一个按键。

缺少的部分将有一个方法,该方法I Shadow.Create<I>( Object o)将 1. 生成实现接口的动态代理 1. 验证o要包装的对象是否具有接口指定的所有成员 1. bnous:管理表示字段的属性的转发(即, `_privateMethodWasCalled' 案例)正确

那么,有没有人知道一个实现这样的东西的库(或者觉得写它很无聊?)

一个明显的缺点是,您直到运行时才知道接口是否与 ClassUnderTest 不兼容,但这没关系,因为这仅用于测试。同样 AIUI,私有访问器机制也需要触发重新编译以不时同步内容。

或者有没有更好的方法我错过了?(请记住,我不想将 al privates 全面升级为内部或公共,也不想重写工作代码)

使用 xUnit.net、.NET 3.5;开放使用任何动态代理库或其他

0 投票
1 回答
2927 浏览

.net - SGEN、InternalsVisibleTo 和程序集签名

我正在尝试做一些不寻常的事情......

我有这个类 Foo :

注意 Name 的内部 setter 和内部默认构造函数。这通常会阻止 XML 序列化,但我还使用 InternalsVisibleTo 将 XML 序列化程序集标记为“朋友”:

我添加了一个 MSBuild 任务来预生成序列化程序集:

这很好用: Name 属性已正确序列化和反序列化。

现在,我想签署我的程序集......所以我为我的程序集定义了一个密钥文件,并修改了 InternalsVisibleTo 声明以匹配密钥:

但现在 SGEN 失败了:

无法生成临时类(结果=1)。
无法将属性或索引器“TestXML2008.Foo.Name”分配给 - 它是只读的

SGEN 任务应该通过宏选择密钥文件,但显然这还不够……我还尝试在 SGEN 任务中明确指定密钥文件,但没有成功。当我在命令行上使用 sgen.exe 时,我得到了相同的结果......

我错过了什么吗?我不明白为什么在我签署程序集时它不起作用......

0 投票
1 回答
1698 浏览

c# - InternalsVisibleTo 导致 CS0246 错误:找不到类型或命名空间

我试图通过添加使一个程序集能够访问另一个程序集的内部类

到第二次大会。但是,这会导致以下错误:

我在这里关注示例: MSDN 参考

我究竟做错了什么?

0 投票
3 回答
1105 浏览

c# - 什么是程序集的“AllInternalsVisible”参数:InternalsVisibleTo 属性?

我的 IntelliSense 在声明中提出了一个名为“AllInternalsVisible=”的布尔值参数[assembly:InternalsVisibleTo("AssemblyName")]。只需将光标放在第二个双引号之后,然后按 Ctrl-空格键。那是什么 - 我在 MSDN 上找不到任何关于此的文档。我正在使用 VS2005 和 .Net 2.0。

作为一个相关主题,我正在对朋友程序集进行一些研究,我认为一旦您授予朋友程序集对内部的访问权限,该朋友程序集就可以访问所有内部,并且您无法真正了解它。这是真的,还是有一种方法(如上所述)可以授予朋友程序集访问某些内部类型/成员但不是全部的权限?

0 投票
1 回答
198 浏览

.net - 无法获取 4.0 beta 2 程序集的完整公钥

我在获取某些 .net 4.0 beta 2 程序集的公钥时遇到问题,因此我可以让他们看到我的内部结构(粗略)。

通常情况下,我只需进入 SN.EXE,然后我就会拥有它们。

但是,我没有得到我通常期望的东西,而是得到了一个伪造的公钥,我不确定为什么。

我使用的是 64 位版本的 SN

C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\x64>sn.exe

我正在针对我所针对的 64 位版本的 dll 使用它:

C:\Windows\Microsoft.NET\Framework64\v4.0.21006\system.xaml.dll

我得到这个作为我的输出:

公钥是 00000000000000000400000000000000

公钥令牌是 b77a5c561934e089

令牌是正确的,但公钥是 BS。这里发生了什么??