使用.net反射机制实现 “热”更新动态库(dll文件)

因为考虑性能能方面的问题,一般指标在系统开启时会被预先加载到内存,但新创建的指标需要加载到内存,已有指标需要更新也需要覆盖原dll文件。新创建的指标很容易就放到指标“库”(指标dll文件存放的目录),但要覆盖原dll文件就不容易了,原因是dll文件被其他程序占用了。

其实文件被其他程序占用的情况我们经常遇到,主要是其他程序在使用文件时没有释放文件的句柄,从这里入手不能发现解决方法,就是把文件加载到内存,并且释放文件句柄。

将原加载动态库的代码:

Assembly assembly = Assembly.LoadFile(assemblyFile);

  

改成:

byte[] assemblyBuf = File.ReadAllBytes(assemblyFile);
Assembly assembly = Assembly.Load(assemblyBuf);

参考: http://guangboo.org/2012/06/21/update-net-dll-file-without-restart-system

时间: 2024-10-24 16:57:20

使用.net反射机制实现 “热”更新动态库(dll文件)的相关文章

VC下动态库dll,静态库lib的编写和使用方法

  在一些项目中,考虑到系统的安全性和稳定性,经常要封装一些DLL或者LIB库供别人使用,那么怎么制作DLL或者LIB文件呢?今天特酷吧根据自己的实际情况给大家讲解下基本的制作方法.以下是我亲自操作的记录:1,动态库dll的编写方法:新建一个动态链接库: 填好工程名称即可选择工程类型,如果没有特别的要求,选择一个空工程即可.会看到这里和标准的控制台工程一样,没有任何系统默认建立的文件 下面就需要我们添加一些文件.建立动态库dll文件 , 我们不需要写main函数.只需要一个一个的实现我们需要实现

【短视频SDK】如何导入Android的AAR?动态库so文件到底怎么样放呢?

开发者在拿到短视频Android的SDK的时候会有些觉得不太一样,为什么SDK提供的是AAR文件和几个so文件呢?我们常见的SDK不是都是jar包吗?文本试图将AAR是什么,如何导入出现的问题进行一个归纳总结,希望开发者读完能够解决这种类型的问题. 1.什么是AAR文件?如何导入AAR文件? 1.1 什么是AAR文件? 开发者在开发的时候大家都遵循组件化的思路写代码,比如我们在写一个圆形的自定义组件的时候,这个组件是一个独立的组件,但是他可能不仅仅包含Java代码,还有很多资源甚至是底层so文件

activex-C#开发ActiveX控件调用动态库DLL

问题描述 C#开发ActiveX控件调用动态库DLL 我想开发一个C# ActiveX控件调用动态库DLL,能够在网页中使用,创建ActiveX控件我已经完成了,但调用DLL动态库没有相应的反馈给我,就像没有做任何操作一样,网上说把动态库DLL放到windows/System32下面,可以调用成功,但我照做了,还是没有反应,我的系统是WIN732位,动态库DLL在C/S程序下调用是没有问题,希望高人帮忙解答下,如果对问题有什么不明白之处,可以留言,谢谢 解决方案 ActiveX控件需要注册(命令

Linux/Unix 下调试动态库(.so文件)

问题描述 Linux/Unix 下调试动态库(.so文件) 需要调试一个C语言编写的动态库,这个动态库也是我自己写的编译的时候加了-g参数. 但是这个动态库是给oracle数据库调用的,也就是在存储过程里面调用这个动态库.由于这个动态库是新写的,经常有问题需要用gdb跟踪代码调试.我要怎么做才能调试这个动态库呢??? 目前想到的一个办法就是再写一个C程序调用这个动态库然后gdb调试.但是这个动态库提供给数据库的接口很多全部写出来比较费时间.希望找个方便点的方法,类似于gdb直接调试运行中的程序.

c++-C#调用C++动态库DLL中的函数

问题描述 C#调用C++动态库DLL中的函数 C#调用C++动态库DLL中的函数,此函数参数中有bool(小写)类型的参数.c#该如何进行转换 解决方案 C#调用C++动态库dllC#调用C++动态库(dll)C#动态调用C++编写的DLL函数 解决方案二: bool类型的true 或false一般对应1和0.有的语言没有bool类型的.传递参数时可用整型替代. 解决方案三: public static extern int RD_CloseCom(bool IsOpen); 解决方案四: 在C

C#调用c++的动态库dll演示例程

1.首先编写c++动态库 extern "C" __declspec(dllexport) int __stdcall add(int x, int y) { return x + y; } extern "C" __declspec(dllexport) extern "C"使得在C++中使用C编译方式成为可能.在"C++"下定义"C"函数,需要加extern "C"关键词.用exte

C++ 调用lib 和 dll的 方法 及 动态库DLL与静态库lib的区别

C++ 调用.lib的方法: 一: 隐式的加载时链接,有三种方法     1  LIB文件直接加入到工程文件列表中 在VC中打开File View一页,选中工程名,单击鼠标右键,然后选中"Add Files to Project"菜单,在弹出的文件对话框中选中要加入DLL的LIB文件.然后在首先要使用该函数的地方加上该LIB的头文件,如#include "..\lib.h"即可(没有头文件当然就不用了). 2  设置工程的 Project Settings来加载DL

请问,用反射加载 .net类库的程序集,dll文件在哪个目录位置?

问题描述 Assembly.LoadFile加载[.net类库]的程序集文件,具体是哪个文件谢谢! 解决方案 解决方案二:不知道,求高手解答.解决方案三:我晕,你要加载哪个,别人怎么知道?解决方案四:用.Net2.0的反编译工具好了解决方案五:楼上的:要所有.net类库的程序集文件,dllAssembly.LoadWithPartialName(命名空间名)可以直接引用类库的命名空间名,在全局程序集缓存(gac),栽入程序集,但是(gac)好像并没有加载全部.net类库??只有很少一部分,所以我

spark加载使用第三方动态库.so文件

问题描述 这边有个任务,通过音频来解析年龄和性别,这个过程中需要用到第三方动态库(.so文件),请教大神在spark中怎样加载和使用第三方库? 解决方案 解决方案二:spark的每个节点也是一个linux主机,.so文件放到各个节点,工程通过java调用.so试试解决方案三:这种方法太笨了,我想要的是通过spark代码加载进来,然后发布到各个计算节点,就类似hadoop的DistributedCache.addFileToClassPath()函数.解决方案四:我用的是python,pyspar