当我在程序启动后复制 DLL 时,在运行时加载程序集失败

2024-04-14

在运行时我加载一个程序集

Assembly assembly = Assembly.LoadFrom(@"c:\MyFolder\MyAssembly.dll");

如果程序集位于该文件夹中,则此方法有效。

如果程序集不在文件夹中,我会得到一个异常,当然告诉我无法找到程序集或其依赖项之一。

我正在捕获异常并向用户显示错误消息。程序继续运行。

如果我现在将丢失的程序集复制到文件夹“c:\MyFolder”,而程序仍在运行,并再次触发该函数来执行上面的行我得到同样的异常 - System.IO.FileNotFoundException - 再次无法找到程序集,尽管 DLL 现在位于文件夹中.

如果我重新启动应用程序,它就会工作并找到程序集。如果我在应用程序启动后第一次尝试加载程序集之前启动应用程序并将 DLL 复制到文件夹中,它也可以工作。

所以问题似乎与第一次失败的调用有关Assembly.LoadFrom.

造成这种行为的原因是什么?我可以采取什么措施来解决该问题?

提前感谢您的帮助!

编辑:还有一个细节:

我添加了一个File.Exists test:

string filename = @"c:\MyFolder\MyAssembly.dll";
bool test = File.Exists(filename);
Assembly assembly = Assembly.LoadFrom(filename);

test回报true but Assembly.LoadFrom抛出一个FileNotFoundException.


功能,而不是错误。这是DLL Hell的对策。操作术语是“加载上下文”,搜索苏珊娜·库克的博客 http://blogs.msdn.com/b/suzcook/来了解更多关于这句话的信息。简而言之,CLR 会记住以前加载程序集的尝试。首先也是最重要的,它记录成功的绑定并保证exact即使磁盘内容已更改,也会再次加载相同的程序集。毫无疑问,你可以看到这样做的好处,突然变得another装配几乎总是灾难性的。

对于failed程序集绑定。它也会记住这些,出于同样的原因,它将来也会失败。据我所知,没有记录的方法可以重置加载上下文。 Assembly.LoadFile() 在没有加载上下文的情况下加载程序集。但这会导致一系列其他问题,您真的不想使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我在程序启动后复制 DLL 时,在运行时加载程序集失败 的相关文章

随机推荐

  • D3 JS - Force Graph - 删除节点后不重新启动布局

    更新 现在 删除节点后图表可以正常运行 但是 当我有条件地删除非顺序节点 例如 4 5 10 时 图表不会显示正确的节点 请查看下面更新的点击处理程序 大量调试 我试图删除所有具有 d source 值 news24 的节点 它们都是大的蓝
  • 由于 poppler 无法在 Windows 上安装 pdftotext

    我正在尝试在 Windows 上安装 pdftotext pip install pdftotext 它最初失败是因为缺少 MS Visual Studio 现已安装 现在它因 poppler 问题而失败 我已经下载了 poppler 并安
  • Objective-C 中带有扫描过滤器的 dynamodb scanexpression

    AWSDynamoDBObjectMapper dynamoDBObjectMapper AWSDynamoDBObjectMapper defaultDynamoDBObjectMapper AWSDynamoDBScanExpressi
  • 更新属性包装器(如 @StateObject)会影响不使用该属性的其他视图渲染

    当使用与视图更新关联的不同属性包装器时 一处的更改会影响不使用该属性的视图的呈现 struct ContentView View StateObject var viewModel MyViewModel State var thirdTi
  • PHP比较相等、空字符串、“0”和0

    我了解到 空字符串 0和 0 在php中都表示错误 我想知道 php 在比较相等性时是否考虑到这一点 str echo str 0 yes no prints no A echo str 0 yes no prints yes B A 行表
  • 如何在java中转换wav文件

    如何在java中转换wav文件 AudioFormat targetFormat new AudioFormat sourceFormat getEncoding fTargetFrameRate 16 sourceFormat getCh
  • 实体“HTML.Version”的声明必须以“>”结尾

    我是 XML 解析和 DTD 的新手 我试图创建一个简单的 SpringBean 程序并使用 Spring xml 实例化一个类 Triangle java 我的 DrawingApp java 如下所示 import org spring
  • .NET 中的防篡改配置文件?

    我们提供带有关联配置文件的 NET 应用程序 我们的顾问在安装过程中创建配置文件 我们希望让客户端很难篡改配置文件 我们有哪些途径 目前 我正在考虑使用我们的私钥对配置文件进行签名 并在应用程序启动时根据公钥对其进行验证 然后我将公钥隐藏在
  • 让 HTML5 视频适合父元素大小

    我在 中有一个 元素 当页面上的其他元素动态调整 添加 删除时 该元素会自动调整大小 我希望视频元素也能自动调整大小 以便它始终包含在其背景 div 中 如果我将视频元素的 CSS 高度和宽度设置为 100 这种方法就有效 因此它的大小始终
  • 具有动态排序依据的 LINQ 查询

    我有一个查询 我需要基于查询字符串参数进行排序 例如 如果排序参数是价格 则查询需要随价格更改 如果其评级则更改查询以按评级排序 我知道 PredicateBuilder 可以执行 And 和 OR 操作 但是如何进行动态 ordeby l
  • 创建新对话框时出现 NullPointerException

    我有一个 DialogFragment 它创建一个列表视图对话框 并在列表项上单击 我想显示一个警报对话框 但是当我创建该对话框时 它给了我一个NullPointerException出现我以前从未见过的错误 08 05 11 40 42
  • F# 的 timeit 函数

    我想写一些类似的东西 let timeit x a gt b let start System DateTime Now x let duration System DateTime Now start printfn time usage
  • Dtrace 中的局部变量

    如何使用 dtrace 访问函数的本地变量 例如 在下面的代码片段中 我想使用 dtrace 了解变量 x 的值 void foo int a int x some fun a 对于内核代码来说 跟踪局部变量是不可能的 因为没有检测任意内核
  • Android实现ScrollView setOnScrollChangeListener

    在我的显示和隐藏一些小部件的应用程序中 我在该网站上找到了以下代码 但我无法在我的片段上实现它 例如 public abstract class HidingScrollListener extends RecyclerView OnScr
  • 如何从命令行设置MySQL会话wait_timeout?

    正如您从下面的输出中看到的 我正在使用 MySQL shell 来更改会话的wait timeout可变为 30 秒 有用 但是 是否可以从命令行设置此变量 mysql u root h 127 0 0 1 p Enter password
  • .Net TimeZoneInfo ID - 是否特定于 Windows 语言?

    我正在使用 net TimeZoneInfo FindSystemTimeZoneById 方法 据我所知该方法查询注册表 存储在注册表 HKEY LOCAL MACHINE Software Microsoft Windows NT Cu
  • Python 调试器的列表理解范围错误

    在调试我的代码时 我想使用列表理解 但是 当我在函数内部时 我似乎无法从调试器评估列表理解 我正在使用Python 3 4 脚本内容 cat test py usr bin python def foo x 1 2 3 3 4 print
  • 模拟 ZPL 打印机

    为了在我的 Mac 上模拟 ZPL 打印机 我在互联网上搜索了几天 最后 我在这里发布了一个解决方案 以便其他用户可以发现它有帮助 我想在这里发布我的解决方案模拟 Zebra 打印机 https stackoverflow com ques
  • 根据 JQGRID 中的条件编辑行

    在 JQGRID 中使用表单编辑 我用不同的颜色显示行 红色 无法编辑行 黑色 可以编辑行 1 Option 当用户单击编辑按钮并且所选行为红色时 应显示消息记录 无法编辑 2 选项 如果用户选择了黑色标记的可编辑行 用户可以编辑该行 但是
  • 当我在程序启动后复制 DLL 时,在运行时加载程序集失败

    在运行时我加载一个程序集 Assembly assembly Assembly LoadFrom c MyFolder MyAssembly dll 如果程序集位于该文件夹中 则此方法有效 如果程序集不在文件夹中 我会得到一个异常 当然告诉