问题标签 [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.
.net - InternalsVisibleTo 属性不起作用
我正在尝试使用InternalsVisibleTo
程序集属性使 .NET 类库中的内部类对我的单元测试项目可见。出于某种原因,我不断收到一条错误消息,上面写着:
'MyClassName' 由于其保护级别而无法访问
两个程序集都已签名,并且我在属性声明中列出了正确的密钥。有任何想法吗?
.net - 使用“朋友”声明进行单元测试。馊主意?
[当然,问题不限于特定的“朋友”实现,尽管如果相关,请随时指出实现细节]
阅读未回答的问题,我偶然发现了这个InternalsVisibleTo
属性:
指定通常仅在当前程序集中可见的类型对另一个程序集可见。
MSDN上的C# Programming Guide有一节Friend Assemblies描述了如何使用属性来允许对另一个程序集使用方法和类型。internal
我想知道使用它来创建一个“隐藏”接口来检测库以供单元测试程序集使用是否是一个好主意。它似乎在两个方向上都大大增加了耦合(在生产程序集中测试代码,在测试代码中对生产程序集的深入了解),但另一方面,它可能有助于创建细粒度的测试,而不会弄乱公共接口。
你在测试时使用友元声明是什么体验?是你的银弹,还是它开始了死亡行军?
.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 中的评论,我将属性更改为以下,但这仍然不起作用。
.net - XmlSerializer 和 InternalsVisibleTo 属性
是否可以XmlSerializer
通过使用InternalsVisibleTo
属性来序列化内部类成员?
如果是,我应该让我的内部组件对哪个组件可见。换句话说,我应该为InternalsVisibleTo
属性提供什么程序集名称和公钥。
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 的一部分)?
.net - 用于测试私有方法的非代码生成转发 shim
一般来说,我设计类的方式是为了测试目的不需要访问私有数据。安InternalsVisibleTo
也可以帮忙。
但是,我目前正在处理一个代码库,该代码库有一些区域已经依赖于 [VSTS 中的私有访问器机制]( http://msdn.microsoft.com/en-us/library/ms184807(VS.80 ).aspx)(即,VSCodeGenAccessors
用于生成*_Accessor
具有转发的类,这些转发使用反射来调用类上的private
成员(以及可选internal
的成员)。
所以我有这样的代码:
(是的,充满了反模式——但请不要向信使开枪)
我对此有很多问题:
- 我希望能够澄清我需要哪些隐私
- 我不想调用对话框(是的,我是一个 CRaholic)
- 我不想在图片中涉及代码生成
所以我希望能够将上面的代码转换为:
我的测试程序集中只有以下界面,没有生成代码或自定义构建步骤:-
从那里,我可以使用 CodeRush 或 Ctrl KM 在界面上生成新的阴影方法,只需一个按键。
缺少的部分将有一个方法,该方法I Shadow.Create<I>( Object o)
将 1. 生成实现接口的动态代理 1. 验证o
要包装的对象是否具有接口指定的所有成员 1. bnous:管理表示字段的属性的转发(即, `_privateMethodWasCalled' 案例)正确
那么,有没有人知道一个实现这样的东西的库(或者觉得写它很无聊?)
一个明显的缺点是,您直到运行时才知道接口是否与 ClassUnderTest 不兼容,但这没关系,因为这仅用于测试。同样 AIUI,私有访问器机制也需要触发重新编译以不时同步内容。
或者有没有更好的方法我错过了?(请记住,我不想将 al privates 全面升级为内部或公共,也不想重写工作代码)
使用 xUnit.net、.NET 3.5;开放使用任何动态代理库或其他
.net - SGEN、InternalsVisibleTo 和程序集签名
我正在尝试做一些不寻常的事情......
我有这个类 Foo :
注意 Name 的内部 setter 和内部默认构造函数。这通常会阻止 XML 序列化,但我还使用 InternalsVisibleTo 将 XML 序列化程序集标记为“朋友”:
我添加了一个 MSBuild 任务来预生成序列化程序集:
这很好用: Name 属性已正确序列化和反序列化。
现在,我想签署我的程序集......所以我为我的程序集定义了一个密钥文件,并修改了 InternalsVisibleTo 声明以匹配密钥:
但现在 SGEN 失败了:
无法生成临时类(结果=1)。
无法将属性或索引器“TestXML2008.Foo.Name”分配给 - 它是只读的
SGEN 任务应该通过宏选择密钥文件,但显然这还不够……我还尝试在 SGEN 任务中明确指定密钥文件,但没有成功。当我在命令行上使用 sgen.exe 时,我得到了相同的结果......
我错过了什么吗?我不明白为什么在我签署程序集时它不起作用......
c# - 什么是程序集的“AllInternalsVisible”参数:InternalsVisibleTo 属性?
我的 IntelliSense 在声明中提出了一个名为“AllInternalsVisible=”的布尔值参数[assembly:InternalsVisibleTo("AssemblyName")]
。只需将光标放在第二个双引号之后,然后按 Ctrl-空格键。那是什么 - 我在 MSDN 上找不到任何关于此的文档。我正在使用 VS2005 和 .Net 2.0。
作为一个相关主题,我正在对朋友程序集进行一些研究,我认为一旦您授予朋友程序集对内部的访问权限,该朋友程序集就可以访问所有内部,并且您无法真正了解它。这是真的,还是有一种方法(如上所述)可以授予朋友程序集访问某些内部类型/成员但不是全部的权限?
.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。这里发生了什么??