首页 > 编程语言 >asp.net 动态加载与卸载程序集的尝试(没有成功)欢迎解决的朋友留言告知

asp.net 动态加载与卸载程序集的尝试(没有成功)欢迎解决的朋友留言告知

时间:2024-07-17 17:31:02浏览次数:13  
标签:asp string AppDomain dllName 卸载 net null public 加载

参考 C#.Net 如何动态加载与卸载程序集(.dll或者.exe)0-------通过应用程序域AppDomain加载和卸载程序集 - 龙骑科技 - 博客园 (cnblogs.com)

大概意思是微软的.NET运行不支持直接卸载应用程序集,因为一旦加载程序集,即使是动态加载就会给该程序集加载到当前正在运行的主线程上,如果想卸载程序集就需要停掉当前主线程,所以不能这么操作。

文章介绍为了实现动态加载和卸载,可以通过AppDomain创建子程序集,需要卸载时就卸载掉整个AppDomain,

但是不知道什么原因,在执行AppDomain加载子程序集时跟断点明明已经拿到了dll文件的程序集,但在返回的时候会报没有序列化的异常。

接下来我给我的代码运行代码贴出来看一下

首先创建Plugin1类库项目并创建One.cs文件内容如下发布出文件为Plugin1.dll文件

using System;

namespace Plugin1
{
    [Serializable]
    public class One : MarshalByRefObject
    {
        public string GetName(string name)
        {
            return "输出当前名字:" + name;
        }
    }
}

然后创建新的测试项目首先创建类ObjectLoader1.cs文件代码如下

  1 using System;
  2 using System.Collections;
  3 using System.Reflection;
  4 
  5 /// <summary>
  6 /// ObjectLoader 的摘要说明
  7 /// </summary>
  8 public class ObjectLoader1:IDisposable
  9 {
 10     protected Hashtable domains = new Hashtable();
 11     public ObjectLoader1() { }
 12     public object GetObject(string dllName,string typeName,object[] constructorParms)
 13     {
 14         AssemblyLoader al = null;
 15         object o = null;
 16         if (al == null)
 17         {
 18             AppDomainSetup setup = new AppDomainSetup();
 19             setup.ShadowCopyFiles = "true";
 20             AppDomain domain = AppDomain.CreateDomain(dllName, null, setup);
 21             domains.Add(dllName, domain);
 22             object[] parms = { dllName };
 23             BindingFlags bindings = BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.Public;
 24             try
 25             {
 26                 var ww = CYQ.Data.AppConst.WebRootPath;
 27                 var currAssembly=Assembly.GetExecutingAssembly();
 28                 al = (AssemblyLoader)domain.CreateInstanceFromAndUnwrap(currAssembly.CodeBase, "AssemblyLoader", true, bindings, null, parms, null, null);
 29             }
 30             catch (Exception e1)
 31             {
 32                 throw new Exception();
 33             }
 34         }
 35         if (al != null)
 36         {
 37             o = al.GetAssembly();
 38         }
 39         return o;
 40     }
 41     public void Unload(string dllName)
 42     {
 43         if (domains.ContainsKey(dllName))
 44         {
 45             AppDomain domain = (AppDomain)domains[dllName];
 46             AppDomain.Unload(domain);
 47             domains.Remove(dllName);
 48         }
 49     }
 50     ~ObjectLoader1() {
 51         dispose(false);
 52     }
 53     public void Dispose() {
 54         dispose(true);
 55     }
 56     private void dispose(bool disposing)
 57     {
 58         if (disposing)
 59         {
 60             foreach(object o in domains.Keys)
 61             {
 62                 string dllName = o.ToString();
 63                 Unload(dllName);
 64             }
 65             domains.Clear();
 66         }
 67     }
 68 }
 69 public class AssemblyLoadFailureException1 : Exception
 70 {
 71     public AssemblyLoadFailureException1() : base()
 72     {
 73     }
 74 
 75     public override string Message
 76     {
 77         get
 78         {
 79             return "Assembly Load Failure";
 80         }
 81     }
 82 
 83 }
 84 public class AssemblyLoader1 : MarshalByRefObject, IDisposable
 85 {
 86     private Assembly a = null;
 87     public AssemblyLoader1() { }
 88     public AssemblyLoader1(string fullPath) {
 89         if (a == null)
 90         {
 91             a = Assembly.LoadFrom(fullPath);
 92         }
 93     }
 94     ~AssemblyLoader1() {
 95         dispose(false);
 96     }
 97     public void Dispose()
 98     {
 99         dispose(true);
100     }
101     private void dispose(bool disposing)
102     {
103         if (disposing)
104         {
105             a = null;
106             GC.Collect();
107             GC.WaitForPendingFinalizers();
108             GC.Collect(0);
109         }
110     }
111     public Assembly GetAssembly()
112     {
113         return a;
114     }
115     public Assembly LoadAssembly(string dllName)
116     {
117         try
118         {
119             a = Assembly.LoadFrom(dllName);
120             return a;
121         }
122         catch (Exception)
123         {
124             throw new AssemblyLoadFailureException1();
125         }
126     }
127 }

 

然后调用代码

1 var ww = AppDomain.CurrentDomain.BaseDirectory;
2 ObjectLoader1 ol = new ObjectLoader1();
3 var o = ol.GetObject(ww + "Plugin1.dll", "Plugin1.One", new object[] { });

断点ObjectLoader1.cs文件的37行,和ObjectLoader1.cs的113行,F10执行,会发现在执行完113行之后代码正常返回,但紧跟着回到第37行时,代码抛出异常

System.IO.FileNotFoundException:“未能加载文件或程序集“Plugin1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的

接下来就不知道如何解决了,只能搁置到这里了,如果哪位大神有解决方案希望可以告知!

 

标签:asp,string,AppDomain,dllName,卸载,net,null,public,加载
From: https://www.cnblogs.com/uxinxin/p/18307912

相关文章

  • 钡铼Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP、OPC UA分布式IO系统BL20X系列耦
    BL20X系列耦合器是钡铼技术开发的一款用于分布式I/O系统的设备,专为工业环境下的高速数据传输和远程设备控制而设计,支持多种工业以太网协议,包括Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP和OPCUA等。如果您正在考虑部署BL20X系列耦合器又不知选择哪款,那不妨来看一看钡铼......
  • ASP.NET Core -NLog
    1.安装NuGet包2.准备Nlog的配置文件 nlog.config<?xmlversion="1.0"encoding="utf-8"?><nlogxmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"au......
  • 端口转发工具rinetd 交叉编译及端口配置(下载、交叉编译、端口转发)
    端口转发工具rinetd从下载到使用(下载、交叉编译、端口转发)一、下载下载:https://wwm.lanzoue.com/ixjKn24phczg密码:apeb二、交叉编译1、进入源代码目录cd~/software/rinetd-0.702、清理现有配置和生成的文件makedistclean3、新建build文件夹,并进入mkdirbuildcdb......
  • 在 Kubernetes 上部署 llama3
    转自:https://zhuanlan.zhihu.com/p/695534674Ollama与OpenWebUI介绍Ollama 是一个运行大模型的工具,可以看成是大模型领域的Docker,可以下载所需的大模型并暴露API。OpenWebUI 是一个大模型的WebUI交互工具,支持Ollama,即调用Ollama暴露的API实现与大模型交互:部署......
  • .NET开源、简单、实用的数据库文档生成工具
    前言今天大姚给大家分享一款.NET开源(MITLicense)、免费、简单、实用的数据库文档(字典)生成工具,该工具支持CHM、Word、Excel、PDF、Html、XML、Markdown等多文档格式的导出:DBCHM。支持的数据库SqlServer、MySQL、Oracle、PostgreSQL、DB2、SQLite。文档的内容都包含什么?序号|......
  • log4net 在.NET Core 控制台程序中的应用(2)
    简介本文主要讲解log4net在.NETCore控制台程序中的应用步骤1.安装log4netNuget包2.增加配置文件3.直接调用4.验证结果实施1.安装log4netNuget包首先,需要在你的.NETCore项目中安装log4net包。可以通过NuGet包管理器来安装。打开你的项目,然后使用以下命令安装log4net:......
  • log4net 在.NET Core 控制台程序中的应用
    简介本文主要讲解log4net在.NETCore控制台程序中的应用步骤1.安装log4netNuget包2.增加配置文件3.增加封装的LogHelper的类4.调用5.验证结果实施1.安装log4netNuget包首先,需要在你的.NETCore项目中安装log4net包。可以通过NuGet包管理器来安装。打开你的项目,然后使......
  • ASP.NET Core-自动映射
    1.安装NuGet包AutoMapper 2.建立示例Entity、DtoEntitypublicclassUser{publiclongId{get;set;}///<summary>///账号///</summary>publicstringUserName{get;set;}///<summary>///名字//......
  • YOLOv10改进 | 注意力篇 | YOLOv10引入ParNetAttention注意力
    1. ParNetAttention介绍1.1 摘要:深度是深度神经网络的标志。但是,深度越大,意味着顺序计算越多,延迟也越长。这就引出了一个问题--有没有可能建立高性能的“非深度”神经网络?我们证明了这一点。为此,我们使用并行子网,而不是一层接一层堆叠。这有助于在保持高性能的同时有效地......
  • YOLOv10改进 | 独家创新- 注意力篇 | YOLOv10引入结合EMAttention和ParNetAttention形
    1.EPAAttention介绍     EPAAttention注意力机制综合了EMAttention和ParNetAttention的优势,能够更有效地提取图像特征。     (1).综合性与多样性     EPAAttention结合了两种不同的注意力机制,充分利用了EMAttention的分组归一化和特征增强......