如何快速获得.net程序引用的程序集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何快速获得.net程序引用的程序集相关的知识,希望对你有一定的参考价值。

1,在vs2005中新建一个工程,如testtools,项目类型选择windows应用程序。

2,在windows form上面拖入一个文件浏览的botton,和一个文本框,然后在botton的事件上面录入如下代码:

/// <summary>
        /// 浏览按钮
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        
            this.openFileDialog1.Filter="可执行文件|*.exe";
            this.openFileDialog1.ShowDialog();
            this.textBox1.Text = this.openFileDialog1.FileName.Trim();
            if (this.textBox1.Text.Trim() == string.Empty)
            
                MessageBox.Show("选择文件,文件类型为dll或者exe", "数慧测试平台");
                return;

            
           return;

        


3,在windows form上面拖入普通的botton,然后在botton的事件上面录入如下代码:

/// <summary>
        /// 获取引用列表
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        
            if (this.textBox1.Text.Trim() == string.Empty)
            
                MessageBox.Show("请先选择文件", "数慧测试平台");
                return;
            

           
            if (this.radioButton1.Checked == true)
            
             //这里将程序引用信息写入到txt中,读者可以自定义。
                TestLogManager testlog = new TestLogManager();
                StreamWriter swriter = testlog.getStreamwriter(Application.StartupPath + "//安装测试//" + "程序引用日志.txt");
                swriter.WriteLine("引用dll名称/t" + "版本/t" + "公钥");
                
                
                IList<string> pList = new List<string>();
                ArrayList pList2 = new ArrayList();
                try
                
                    Assembly asscembly = Assembly.LoadFile(this.textBox1.Text.Trim());//装载程序集
                    GetAssemblysRecurse(asscembly, pList, pList2);
                    //对输出结果进行排序
                    pList2.Sort(new myReverserClass());

                    foreach (AssemblyName pAssemblyNameReferenced in pList2)
                    

                        // 获得程序引用的名称
                        swriter.WriteLine("" + pAssemblyNameReferenced.Name + "/t" + pAssemblyNameReferenced.Version + "/t" + pAssemblyNameReferenced.KeyPair);

                    
                
                finally
                
                    swriter.Close();
                
                MessageBox.Show("完成!" + "请查看:" + Application.StartupPath + "//安装测试//程序引用日志.txt", "数慧测试平台");
                return;

            
            else
            
                return;
            

        
        /// <summary>
        /// 排序方法
        /// </summary>
        public class myReverserClass : IComparer
        
            int IComparer.Compare(object x, object y)
            
                return (x as AssemblyName).Name.CompareTo((y as AssemblyName).Name);
            
        

        /// <summary>
        /// 递归函数,递归获得程序集合名称,然后写入日志中。
        /// </summary>
        /// <param name="swriter"></param>
        /// <param name="asscembly"></param>
        /// <param name="pList"></param>
        private void GetAssemblysRecurse(Assembly asscembly, IList<string> pList, ArrayList pList2)
        
            AssemblyName[] assemblyname = asscembly.GetReferencedAssemblies();//获得引用程序集
            foreach (AssemblyName pAssemblyNameReferenced in assemblyname)
            
                Assembly pAssemblyReferenced = null;
                //先从公共的Assembly中检查是否存在相应的dll,如:C:/WINDOWS/assembly
                try
                
                    pAssemblyReferenced = Assembly.Load(pAssemblyNameReferenced);
                
                catch (Exception)
                
                
                //从可执行的exe下面检查是否存在相应的dll
                if (pAssemblyReferenced == null)
                
                    try
                    
                        
                        pAssemblyReferenced = Assembly.LoadFile(Path.GetDirectoryName(this.textBox1.Text.Trim()) +
                            Path.DirectorySeparatorChar + pAssemblyNameReferenced.Name + ".dll");
                    
                    catch (Exception)
                    

                    
                
                //如果存在引用的dll,然后判断是否为系统的dll。
                if (pAssemblyReferenced != null)
                
                    if (pAssemblyNameReferenced.Name.IndexOf("Test_ms") > -1 ||
                        pAssemblyNameReferenced.Name.IndexOf("Test_System") > -1||
                        pAssemblyNameReferenced.Name.IndexOf("test_office") > -1||
                        pAssemblyNameReferenced.Name.IndexOf("test_Interop") > -1)
                    
                        continue;
                    

                    //如果plist中不存在,则添加。
                    if (pList.IndexOf(pAssemblyNameReferenced.Name) == -1)
                    
                        pList.Add(pAssemblyNameReferenced.Name);                                     
                       //将程序集添加到plist2中,plist2主要是用来排序。
                        pList2.Add(pAssemblyNameReferenced);
                        //执行递归方法
                        GetAssemblysRecurse(pAssemblyReferenced, pList, pList2);
                    
                

            
        

4,编译工程,然后执行exe即可获得引用的程序集列表。

参考技术A 有源码直接用vs打开,引用里面可以看。没有源码需要借助.NET Reflector、ILspy之类的反编译工具,选中需要反编译的.net程序,反编译工具会自动列出.net 程序应用的程序集(所有程序集,包括.net 框架自带的。如system;system.net等)。 参考技术B 转到定义? 参考技术C shift+alt+f10 如果引用里面引用的话

如何在 .NET 3.5 项目中引用 .NET 4.0 程序集

【中文标题】如何在 .NET 3.5 项目中引用 .NET 4.0 程序集【英文标题】:How to reference .NET 4.0 assembly within .NET 3.5 projects 【发布时间】:2010-12-09 06:07:47 【问题描述】:

我想使用 .NET 4.0 做一些 Office Interop 的工作,但使用 VS2008 和 .NET3.5 开发我的项目的其余部分。

我现在如何在我的其他解决方案中使用 .NET 4.0 程序集的功能。将 CLR 4.0 程序集加载到 2.0 AppDomain 中不起作用,是吗?

【问题讨论】:

【参考方案1】:

简而言之:你不能。

.NET 4.0 是一个全新的 CLR (4.0),据我所知,它不能与 .NET 3.5 混合和/或从 VS 2008 中使用,抱歉。

如果您还保证 .NET 2.0 框架与 .NET 4 同时(并排)在您的目标计算机上,则您可以使用 .NET 4.0 代码中的 .NET 2.0 程序集。

【讨论】:

【参考方案2】:

您不能将更高版本的 .NET 框架版本程序集与旧的 .NET 版本一起使用。

【讨论】:

【参考方案3】:

CLR 4 允许InProc Side by side,但您仍然需要查看加载的 2.0 和 4.0 代码之间的一些互操作解决方案。

【讨论】:

【参考方案4】:

对此我不太确定,但我相信你可以这样做(虽然,也许不推荐,但在技术上是可行的。)

由于 Net Framework 4.0 使用不同的 CLR,并且可以并排安装两者...也许您可以尝试将 4.0 程序集加载到 4.0 CLR 中,将 2.0 应用程序加载到 2.0 中,并通过网络在两者之间进行通信服务。

同样,我不确定这是否可行。这只是一些想法。

【讨论】:

不,.Net 中没有跨进程通信。您必须实现自己的非托管 (COM) 通信。 我不明白为什么您不能在 2 个应用程序之间使用 Web 服务,一个用 .Net 2 编写,另一个用 .Net 4 编写。

以上是关于如何快速获得.net程序引用的程序集的主要内容,如果未能解决你的问题,请参考以下文章

如何找出哪个程序集拥有从给定的“编译”对象及其声明语法引用中获得的给定 ISymbol 对象?

ASP.NET Core 3:如何在自定义库中引用 3.0.0 程序集?

.NET 中的引用程序集

我可以在 C# 的设计时迭代引用的程序集吗?

ASP.NET 与用于 .NET 的 Delphi 2007。无法加载文件或程序集...定位的程序集的清单定义与程序集引用不匹配

.NET Standard:程序集的清单定义与程序集引用不匹配