標籤:winform style blog io color ar os 使用 for
本代碼實現DLL的動態載入, 類似PS裡的濾鏡外掛程式!
1. 建立一個介面項目類庫,此處名稱為:Test.IPlugin
using System;namespace Test.IPlugin{ public interface IPlugin { void Run(object obj); }}
2.建立一個DLL外掛程式類庫項目,此項目要引用介面項目‘Test.IPlugin‘,並實現Run方法, 此處名稱為:Test.Plugin
using System;namespace Test.Plugin{ public class Plugin:IPlugin.IPlugin { #region IPlugin 成員 void Test.IPlugin.IPlugin.Run(object obj) { System.Windows.Forms.MessageBox.Show(obj.ToString()); } #endregion }}
3.外掛程式動態載入實現,建立控制台或者WinForm項目及引用介面項目Test.IPlugin, 以下為動態載入代碼
private void btnLoad_Click(object sender, EventArgs e){ string filePath = @"檔案路徑\Test.Plugin.dll"; Assembly dll = null; {//方法一:直接從DLL路徑載入(網上代碼,本機測試出錯) //dll = Assembly.Load(filePath); } {//方法二:先把DLL載入到記憶體,再從記憶體中載入 FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read); BinaryReader br = new BinaryReader(fs); byte[] bFile = br.ReadBytes((int)fs.Length); br.Close(); fs.Close(); dll = Assembly.Load(bFile); } //調用介面 foreach (var t in dll.GetTypes()) { if (t.GetInterface("IPlugin") != null) { var plugin = (IPlugin.IPlugin)Activator.CreateInstance(t); plugin.Run("test"); } }}
以上為實現動態外掛程式模式的代碼,先注意下調用外掛程式的代碼中有2種方法
----------------分割線---------------
注意第一種方法, 在Assembly.Load(filePath)時會拋出異常:
未能負載檔案或程式集“***”或它的某一個依賴項。給定程式集名稱或基本代碼無效。 (異常來自 HRESULT:0x80131047)
在網上查了很多相關解決方案均未能解決這個錯誤,開發環境為VS2008,三個項目均為Framework2.0 X86模式,嘗試過的方式
1.強制CPU模式為X86 2.所有DLL及EXE放置同一目錄 3.取消"啟用Visual Studio宿主進程"
最後無意中看到有用載入到記憶體的方式,然後使用BinaryReader讀取位元組數組再載入, 完美解決.
C# 實現動態載入DLL外掛程式 及HRESULT:0x80131047處理