下載app免費領取會員
Revit開發中AddinManager是一個非常好用的工具,它可以快速的運行我們寫好的命令
并且生成addin文件,最近突然好奇,它是怎么實現這些功能的,然后研究了一下,
發現這里面似乎是通過反射來實現的,他能運行我們的寫的命令最關鍵的是因為下面的代碼
IExternalCommand externalCommand = assembly.CreateInstance(FullClassName) as IExternalCommand;
if (externalCommand != null)
{
result = externalCommand Execute( commandData, ref message, elements)
}
因為用反射創建我們寫的命令的類之前,我們要先加載dll,而加載dl后,如果加載dll的位置和我們生成dll的位置相同
當我們再編譯原來的工程就會失敗,因為我們生成的dll要替換原來的dll,而原來的dll已經被占用,所有就會替換失敗,
我想著就是AddInManager 運行命令之前,要先把dll文件復制到其他地方的原因吧
下面嘗試些一個簡單的AddInManager,并不包括將dll復制到其他地方,和生成addin文件的功能
//創建界面
public class MyApp:IExternalApplication
{
public Result OnShutdown(UIControlledApplication application)
{
return Result.Succeeded;
}
public Result OnStartup(UIControlledApplication application)
{
RibbonPanel panel = application.CreateRibbonPanel(Tab.AddIns, "NewAddInManager");
PushButtonData data = new PushButtonData("NewAddinManager", "MyCommand", this.GetType().Assembly.Location, "NewAddinManager.MyAddInCommand");
panel.AddItem(data);
return Result.Succeeded;
}
}
// addinManager 命令
public class MyAddInCommand : IExternalCommand
{
public string path = null;
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
AppDomain.CurrentDomain.AssemblyResolve += LoadAssemble;
Result result;
OpenFileDialog dialog = new OpenFileDialog();
if (dialog.ShowDialog() == DialogResult.OK)
{
string file = dialog.FileName;
path = new FileInfo(file).DirectoryName;
Assembly ab = Assembly.LoadFile(file);
foreach (Type tp in ab.DefinedTypes)
{
IExternalCommand icmd = ab.CreateInstance(tp.FullName) as IExternalCommand;
if (icmd != null)
{
result = icmd.Execute(commandData, ref message, elements);
break;
}
}
}
return Result.Succeeded;
}
private Assembly LoadAssemble(object sender, ResolveEventArgs args)
{
string dllName = args.Name.Split(new char[] { ',' }).First();
Assembly tab = args.RequestingAssembly;
FileInfo fileInfo = new FileInfo(tab.Location);
DirectoryInfo dir = fileInfo.Directory;// new DirectoryInfo(path);
FileInfo[] files = dir.GetFiles("*.dll", SearchOption.TopDirectoryOnly);
foreach (FileInfo f in files)
{
if (f.Name.Contains(dllName))
{
Assembly ab = Assembly.LoadFile(f.FullName);
return ab;
}
}
return null;
}
}
本文版權歸腿腿教學網及原創作者所有,未經授權,謝絕轉載。
下一篇:二次開發教程:Revit開發之AddInManager安裝包簡單制作
推薦專題