亂語:
你打發無聊時間的方法,決定了你的成色。
今天是庚子年一月一日,就是俗話說的大年初一。全國被新型冠狀病毒引發的傳染病所籠罩,當看到那些衝向災區的逆行者,除了淚目之外,還從心底發出一定要做點兒什麼的急切心願。
我們這些做程式的,自嘲了稱呼聲碼農,往大了說那也是工程師,留下點兒有用於世間的東西吧。於是寫下了這篇文章。
正文:問題背景:
現在搞revit二次開發的人越來越多,一些外界人才的湧入,終於衝擊到了那些非程式專業人搞二次開發的一些頑固想法。市面上,revit二次開發產品ui也慢慢的由傳統的winform向wpf過度。現在似乎已經沒有人在問那種我用winform挺好的,為什麼要換成wpf的守舊問題。但是還是要強答一波,因為revit的ui,起碼選單是wpf開發的,所以二次開發最好就用wpf。其他的優劣對比,一概懶得說了。
但使用wpf開發的類庫有乙個問題。您大概也是因為這個問題才檢索到我這篇文章的。我們使用wpf進行二次開發,一般要把專案編譯成dll。隨著我們對介面顯示或者**結構的要求越來越高。我們可能會在,我們開發的.xaml窗體中,引用到第三方的dll。如果這個第三方的dll,只是在xaml中被使用了,當我們通過revit的命令按鈕去執行時,可能會發生找不到相關dll的異常,但它的的確確時在外掛程式dll的目錄下。
問題剖析:
首先明確這不是revit的問題,wpf進行dll開發時,確實會出現這種「bug」。如果是自己開發的exe可能沒問題,但是dll中xmal解析確實可能存在問題的。至於原因是什麼,我們就不去深究了。
解決問題:
剛開始的時候,我們發現這個問題,用了很粗暴的方法,就是把載入出異常說找不到的dll記錄下來,然後在外掛程式安裝,或者外掛程式啟動的時候,把這些dll 拷貝到revit安裝目錄下。
這種方法能解決問題,但是不夠優雅。現在有了更好的思路。
思路很簡單,在revit啟動外掛程式的時候,主動的自己去載入那些不能自動解析的dll。
/// /// 程式集載入器
///
public class assemblyloader
public assemblyloader()
public readonlycollectionserachpaths
#region 公開方法
/// /// 載入dlls,paths為絕對路徑,或者是在相對於當前dll位置的相對路徑
///
///
public void loaddlls(listpaths)
catch (exception ex)}}
}catch (exception ex)
finally
}private assembly onassemblyresolve(object sender, resolveeventargs args)
.dll", path.combine(item, assemblyname.name));
if (file.exists(file))
catch (exception ex)}}
return args.requestingassembly;
}#endregion
#region 靜態方法
private const string path = "path";
/// /// 增加路徑環境變數
///
///
public static void addenvironmentpath(params string input)
;//加在最前面,
var newpath = string.join(path.pathseparator.tostring(), input.concat(path));
environment.setenvironmentvariable(path, newpath);
}#endregion
}
方法裡進行呼叫。
assemblyloader loader = new assemblyloader();
var dlls = new list();
dlls.add("***.dll");
loader.loaddlls(dlls);
抽象類出現的原因
這個問題沒辦法簡單回答。首先要搞清楚的是繼承有什麼用,函式重寫有什麼用。繼承和函式重寫實現的是 的復用 一次編寫,重複使用 從最簡單的說起。你編寫了乙個函式,你希望下次還要用,你怎麼做?直接呼叫就是了,是不是?那麼我問你,如果你下次要用,但是 不完全一樣,需要修改下,怎麼用?你有兩個辦法 1 複製乙...
抽象類出現的原因
這個問題沒辦法簡單回答。首先要搞清楚的是繼承有什麼用,函式重寫有什麼用。繼承和函式重寫實現的是 的復用 一次編寫,重複使用 從最簡單的說起。你編寫了乙個函式,你希望下次還要用,你怎麼做?直接呼叫就是了,是不是?那麼我問你,如果你下次要用,但是 不完全一樣,需要修改下,怎麼用?你有兩個辦法 1 複製乙...
類產生的原因及相關特性
類的產生其實就是為了使用者方便定義自己的資料型別,類性質和c 中的標準庫型別如string型別是一樣的。可使用關鍵字class或struct來定義類,二者唯一的差別就是類內部成員的預設訪問級別,預設情況下struct的成員為public,而class成員為private。資料抽象和封裝是類的基本思想...