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即可获得引用的程序集列表。
这个不是缺少程序集引用的问题,而是缺少using指令。解决办法有两个首先删掉using System.Data.sqlClient因为这句话写错了(大小写错误)然后:
1. 添加using指令如下,放到文件最前面:
using System.Data.SqlClient
2. 在用到SqlConnection的地方使用全名,及将SqlConnection替换为System.Data.SqlClient.SqlConnection;在用到SqlCommand的地方使用全名,及将SqlCommand替换为System.Data.SqlClient.SqlCommand;
使用前一种方案代码量会降低,后一种程序代码更加易读。
你好!微软的.Net程序集主要可以分两大类:应用程序(也就是通常所说的exe文件),另一类就应用程序扩展(也就是通常所说的动态链接库,dll文件)。
所以,.Net程序集德使用方法和传统的exe和dll文件的方法基本上是一样的。
打字不易,采纳哦!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)