C# 实现动态加载DLL插件 及HRESULT:0x80131047处理
本代码实现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处理的更多相关文章
- 动态加载与插件系统的初步实现(3):WinForm示例
动态加载与插件系统的初步实现(三):WinForm示例 代码文件在此Download,本文章围绕前文所述默认AppDomain.插件容器AppDomain两个域及IPlugin.PluginProvi ...
- c#实现动态加载Dll(转)
c#实现动态加载Dll 分类: .net2009-12-28 13:54 3652人阅读 评论(1) 收藏 举报 dllc#assemblynullexceptionclass 原理如下: 1.利用反 ...
- 用宏定义封装LoadLibrary,方便的动态加载dll
同学们动态加载dll的时候是不是感觉挺麻烦的,每次都::LoadLibrary,::GetProcAddress,还要typedef一堆函数.最近闲来无聊,用宏封装了一下,可以少写不少代码,用来也挺方 ...
- Delphi静态加载DLL和动态加载DLL示例
下面以Delphi调用触摸屏动态库xtkutility.dll为例子,说明如何静态加载DLL和动态加载DLL. 直接上代码. 1.静态加载示例 unit Unit1; interface uses W ...
- C# 利用反射动态加载dll
笔者遇到的一个问题,dll文件在客户端可以加载成功,在web端引用程序报错.解决方法:利用反射动态加载dll 头部引用加: using System.Reflection; 主要代码: Assembl ...
- unity3d动态加载dll的API以及限制
Unity3D的坑系列:动态加载dll 一.使用限制 现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Androi ...
- Unity3D的坑系列:动态加载dll
我现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Android平台是可以动态加载dll的,有了这个就可以实现代码 ...
- C#,动态加载DLL,通过反射,调用参数,方法,窗体
.net中常会用到动态加载DLL,而DLL中可能包含各种参数.方法.窗体,如何来调用动态加载这些参数.方法.窗体呢? 在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系: System. ...
- 动态加载Dll时,通过Type生成类对象
原文:动态加载Dll时,通过Type生成类对象 转:http://www.cnblogs.com/zfanlong1314/p/4197383.html "反射"其实就是利用程序集 ...
随机推荐
- 说说HTML5中label标签的可访问性问题——张鑫旭
一.开篇叨叨 一般稍微有些经验的页面制作人员都知道label标签可以优雅地扩大表单控件元素的点击区域,例如,单纯的单选框点击区域就鼻屎那么大的地方,经常会点不到位置.因此,label标签的使用对于提高 ...
- LINQ语法类似于SQL的语法
LINQ语法类似于SQL的语法如下, Models.BookStoreEntities 是从添加新建项中的数据--->ADO.NET实体数据模型--->从数据库生成--->使用5.0 ...
- PoPo数据可视化周刊第6期
PoPo数据可视化 聚焦于Web数据可视化与可视化交互领域,发现可视化领域有意思的内容.不想错过可视化领域的精彩内容, 就快快关注我们吧 :) 本期可视化精彩视频请关注公众号浏览 全天智能获Pre-A ...
- CSS 属性-webkit-tap-highlight-color的理解
1.-webkit-tap-highlight-color 这个属性只用于iOS (iPhone和iPad).当你点击一个链接或者通过Javascript定义的可点击元素的时候,它就会出现一个半透明的 ...
- 大数据平台的技术演化之路 诸葛io平台设计实例
如今,数据分析能力正逐渐成为企业发展的标配,企业通过数据分析的过程将数据中的信息提取出来,进行处理.识别.加工.呈现,最后成为指导企业业务发展的知识和智慧.而处理.识别.加工.呈现的过程从本质上来讲, ...
- C# Visual 快捷键
编辑系 代码提示 Ctrl + J激活VS默认代码提示功能.ReSharper等插件会建议你修改快捷键. 导入命名空间 个人认为Ctrl + .是最方便的,复杂点的是Alt + Shift + F ...
- CentOS7系列--3.1CentOS7中配置NFS服务
CentOS7配置NFS服务 1. 配置NFS服务器端 1.1. 安装nfs-utils软件 [root@server1 ~]# yum install -y nfs-utils Loaded plu ...
- Android设置日期DatePickerDialog
设置日期DatePickerDialog package com.example.testview; import java.util.Calendar; import java.util.Date; ...
- 百度网盘下载器 PanDownload v2.0
PanDownload是一款坚持以用户体验为中心,畅快淋漓的下载为理念而打造的下载工具. 从2017年2月9日首个版本推出,时至今日已经一年七个月了,首先感谢大家一直以来的支持与建议,促使着我不断地对 ...
- zabbix系列之六——安装后配置二Items
https://www.zabbix.com/documentation/3.4/manual/config/items/itemtypes/snmp 1Items 1.1creating items ...