
界面就大致的设计成这样,将打开DLL文件的按钮添加一个方法openDllFileBtn_Click
在里面实现打开文件并记录文件名的步骤
OpenFileDialog fld = new OpenFileDialog();
DialogResult ret = fld.ShowDialog();
if (ret == DialogResult.Cancel)
{
return;
}
string filePath = fld.FileName;
然后获取本程序集中的所有类型
asm = Assembly.LoadFile(filePath);
Type[] types = asm.GetTypes();
根据类型来获取相关的命名空间名称,过滤掉重复的,就是一个完整的DLL的命名空间结构,保存在treeView1中显示
asm = Assembly.LoadFile(filePath);
Type[] types = asm.GetTypes();
foreach (Type type in types)
{
string spaceName = type.Namespace;
List<string> lvs = GetNameSpaceLevels(type.Namespace);
if (lvs.Count > 0)
{
TreeNode currentParent = null;
for (int i = 0; i < lvs.Count; i++)
{
string currentLv = lvs[i];
if (i == 0)
{
if (this.treeView1.Nodes.ContainsKey(currentLv) == false)
{
this.treeView1.Nodes.Add(currentLv, currentLv);
}
currentParent = this.treeView1.Nodes[currentLv];
}
else
{
if (currentParent.Nodes.ContainsKey(currentLv) == false)
{
currentParent.Nodes.Add(currentLv, currentLv);
}
currentParent = currentParent.Nodes[currentLv];
}
}
}
}
在反序列化的过程中 要注意一个问题
无法加载一个或多个请求的类型。有关更多信息,请检索 LoaderExceptions 属性。

如果出现此错误,把将要反序列化的DLL所引用的DLL全部放在 当前程序运行目录下即可
注意是当前程序运行目录下,如果你写的是一个工具叫 "命名空间获取" 你在调试状态下启动的话, 那么你要把这个DLL引用的文件放在
"命名空间获取" 这个项目的调试启动目录下 比如我的 E:\Visual Studio 2008\Projects\WebApiCreator\WebApiCreator\bin\Debug
而不是在那个要反序列化的文件的同级目录下.
最终反序列化得出的命名空间树展示:

浙公网安备 33010602011771号