C# 获得某个项目中的引用
缘由:
利用CSC.exe编译某个项目的时候,需要获得这个项目中的所有引用.......
最初想的方案:反射
但是得先编译这个项目成DLL,添加引用再反射这个项目所添加的引用~如果要是这样,那就好玩了,每次用CSC.exe编译项目的时候,都得先用VS先将这个项目编译成一遍,再用反射......==!那还不如用VS直接编译来的快一些~
偶然间,发现 *.csproj 文件,它是“C Sharp Project”的缩写。其中记录了项目的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置的信息等。当然还该有项目的引用信息~你用文本打开它的时候,你会发现它是XML文档,引用的信息就在<ItemGroup>下,如果是第三方引用则保存在<Reference>下的<HintPath>的 InnerText,如果是system则保存在 <Reference>.Attributes["Include" ].Value,读取出来对字符串做一些处理即可,此处就不详述了。
接下来要讲的是
项目中有添加这种Interop.XXX.dll,读 *.csproj 文件的时候,你可能会读不出来,因为他保存在<COMReference>节点下,要读取此类引用需要做些处理,产生这类引用的原因是因为:(原文链接)【 在很多项目当中需要安装某些程序并调用接口...虽然配置服务器上也安装了程序,但是发布的程序却不能直接调用...后来发现在VS里调试重新引用一下Dll就没有问题了.但是不可能每安装一次就重新调试一下...因为需要配置的机器未必会安装Visual Studio...有个办法可以解决配置的问题...主角就是:TlbImp.exe 。。。。。。。。。。。
如果执行成功,则会在这个目录下生成一个myTest.dll.然后复制到项目的文件夹下,再引用,就可以了.当然其实也可以先引用COM,然后编译,让VS生成一个Interop.XXX.dll后,把它随着程序一起发布,并且移除原来的COM引用,改为直接引用新生成的Interop.XXX.dll. 】
看到此处,应该明白为什么保存在<COMReference>节点下了吧,遍历该节点,当WrapperTool的InnerText 值为tlbimp时,那么 "Interop." + <COMReference>.Attributes["Include"].Value + ".dll"; 即可
如有问题或建议,欢迎留言 ~ 博客地址:http://www.cnblogs.com/zqiang/ |