Revit WPF類庫不明原因的不能載入?

2021-10-02 09:04:28 字數 2203 閱讀 6175

亂語:

你打發無聊時間的方法,決定了你的成色。

今天是庚子年一月一日,就是俗話說的大年初一。全國被新型冠狀病毒引發的傳染病所籠罩,當看到那些衝向災區的逆行者,除了淚目之外,還從心底發出一定要做點兒什麼的急切心願。

我們這些做程式的,自嘲了稱呼聲碼農,往大了說那也是工程師,留下點兒有用於世間的東西吧。於是寫下了這篇文章。

正文:問題背景

現在搞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。資料抽象和封裝是類的基本思想...