InternalsVisibleToAttribute,友元程序集访问属性

Posted on 2007-10-31 14:17 Vitoria 阅读(2563) 评论(6)  编辑 收藏 网摘 所属分类: .NET
       在工作中经常会碰到类似的情况:我写了个功能模块,现在需要对它进行单元测试,功能模块在某个程序集中,而我的单元测试却在另外一个程序集中。功能模块是对外的,接口上当然是有很严整的访问权限,而单元测试也许需要调用到一些Internal的类或者方法。我们会怎么做呢?VS2003之前,我只好用type.InvokeMember来做。但是也存在很多的问题,当功能模块中的接口发生了变化(要知道,对内接口可是很容易就Rename),那么在编译阶段,单元测试通过了,运行却出错了,我们辛辛苦苦发现啊呀原来是Internal接口变了,可真是郁闷。还带来的另一个问题是如果功能模块被加密了,type.InvokeMember就挂了。现在可就好了,隆重介绍InternalsVisibleToAttribute

      只需要在功能模块的Assembly中指定InternalsVisibleTo到我的单元测试程序集。我的单元测试程序中就可以很容易方便地访问所有Internal的接口了。

      具体举例:
      功能模块, Assembly nameMyModule
      单元测试, Assembly nameMyTest

      Step by step介绍步骤
1.      生成Snk及查找PublicKey,举例中我用sn随机生成了snk文件
生成私钥

生成公钥

获取公钥字符串

可以看到:

Public key
是我们这里要关心的。(Bata2中用到的是Public key token,本文SampleRTM上完成)
这样我们得到了私钥文件test.snkPublic key字符串 

2.   MyModule工程中找到AssemblyInfo.cs,添加:

[assembly: InternalsVisibleTo("MyTest, PublicKey=0024000004800000940000000602000000240000525341310004000001000100253e8697037892e73b8a255dca20b42b4f98a7e9853125bcc11f92c9c1ed2d6ac469c0da7bbc2f05f78fd0b3fac75632582310698554bb6ab89e7997c89ee84501547679900d2ad0e7c4ec4a3d534ae1faf5292a29e892947315ac68c37f304af5090a6065288e6b3e02e35fcb8f3de0534af74e3d65fb4ec9f79de8289774bb")]

3.   MyTestMyModule工程中都添加test.snk

4.   MyTestMyModule工程属性中都指定test.snk签名,如图示

Build
我们的程序,搞定!

 附上示例代码

0
0
(请您对文章做出评价)
« 上一篇:My Tips: 创建Team Build Type时遇到的问题

Feedback

#1楼   回复  引用  查看    

2005-11-23 08:47 by Cavingdeep      
InternalsToVisible的确是一个比较实用的功能:)

#2楼   回复  引用    

2005-11-23 10:19 by tansm[未注册用户]
顶!!!

#3楼   回复  引用    

2005-11-23 11:11 by baoli[未注册用户]
很多人都建议把测试代码和功能模块放到一起的呢。我也觉得应该是放在一起比较好

#4楼[楼主]   回复  引用  查看    

2005-11-23 12:36 by 维多利亚的飞翔      
我在文中只是拿测试代码和功能模块举个例子,实际上我碰到的是我们产品有个Framework,在其上面产生了一族产品,所以会碰到这样的问题。我个人还是建议把测试代码放到另一个工程里,这样对于连续成长的几个版本,可以只需要替换测试代码Reference的dll就可以了,保证了产品的稳定和兼容。

#5楼   回复  引用  查看    

2005-11-23 13:26 by Cavingdeep      
@baoli

我也建议将测试代码分开,这样无论在管理上还是在测试环境的真实度上都比较好。

#6楼   回复  引用    

2007-09-28 18:05 by 秦韶华[未注册用户]
你的代码是打印代码阿..

posts - 20, comments - 56, trackbacks - 0, articles - 0

Copyright © Vitoria