问题标签 [dynamic-assemblies]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
335 浏览

c# - 动态加载.dll文件后释放.dll和.pdb

我正在构建一个 Windows 应用程序,我可以通过单击一个按钮来调用编码的 UI 项目(名为 RecordAndPlayback 的项目) 。我的目标是在编码的 UI 项目中调用测试方法,然后能够修改测试,然后从我的 win 应用程序中调用它,而无需使用相同的按钮关闭它。

我设法调用了测试方法,但是在那之后我在修改测试方法时遇到了问题。每当我构建编码的 UI 项目时,都会出现错误

ERROR CSC(0,0): Unexpected error creating debug information file '...\obj\Debug\RecordAndPlayback.PDB' -- '...\obj\Debug\RecordAndPlayback.pdb: 进程无法访问该文件,因为它正在被另一个进程使用。

我曾经AppDomain在其中加载dll然​​后卸载AppDomain,希望dll将被释放。我设法做到了,但后来我在 .pdb 文件中得到了上述错误。我找到了另一个解决方案,我发现它更简单,但仍然遇到上述问题。

到目前为止,这是我的代码示例:

我尝试使用,AppDomain但它没有用。实际上上面的代码是迄今为止我得到的最好的,我确信 .dll 文件被释放了,因为我可以删除它。此外,bin 文件夹中的 .pdb 文件被释放(也可以删除它)。我的问题是 obj 文件夹中的 .pdb 文件。唯一的方法是我必须关闭我的 Windows 应用程序项目,这样我才能构建我的编码 UI 项目。

如何在不关闭我的 win 应用程序的情况下解决此问题?

0 投票
0 回答
50 浏览

c# - 调用 TypeBuilder.CreateType() 的目的是什么

我很难理解创建动态程序集,下面是一些代码:

所以我的问题是,为什么我们需要调用helloWorldClass.CreateType();来创建一个类型?

因为我们通常会在 main 方法中得到一个类型:

所以我们可以动态获取类型?

编辑:有人说Type.GetType 返回现有的元数据。AssemblyBuilder.CreateType 引入了新的元数据。

所以所有的TypeBuilder.DefineMethod,TypeBuilder.DefineField等都TypeBuilder.DefineConstructor不会“引入”元数据?在旅途中自动调用“写入”或“引入”元数据不是更明智TypeBuilder.DefineXXX,因此不再需要 AssemblyBuilder.CreateType() 吗?

0 投票
0 回答
308 浏览

c# - 未定义或导入预定义类型“System.Object”

我有控制台应用程序,它应该支持脚本(.cs 文件)以更改应用程序的行为。问题是我有 9 个类型为“未定义或导入预定义类型”的错误

在此处输入图像描述

我搜索了很多,无法解决问题,我的代码是

0 投票
0 回答
28 浏览

c# - 当 .NET 可收集程序集被垃圾收集时是否会触发事件(例如,使用 RunAndCollect 发出的程序集)

当 .NET 可收集程序集被垃圾收集时是否会触发事件(例如,使用 RunAndCollect 发出的程序集)。AppDomain.AssemblyLoad 事件之类的东西?

0 投票
0 回答
83 浏览

c# - 使用 RunAndCollect 而不是 RunAndSave 时出现 CLR 错误

当动态生成程序集时,我们经常会得到这个异常:

托管调试助手“FatalExecutionEngineError”消息=托管调试助手“FatalExecutionEngineError”:“运行时遇到致命错误。错误地址位于线程 0x25ac 上的 0xa3851e22。错误代码为 0xc0000005。此错误可能是 CLR 中的错​​误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM-interop 或 PInvoke 的用户封送错误,这可能会损坏堆栈。

在加载 CLR 符号时,它总是与此调用堆栈一起抛出:

当 AssemblyBuilderAccess 设置为 RunAndSave 时不会发生此问题,但将其设置为 RunAndCollect 时会可靠地发生。它总是被抛出这个调用堆栈。RunAndCollect 是否存在 CLR 错误?据我们所知,我们持有对这些动态程序集的 Assembly 和 Module 反射对象的引用,这意味着它们永远不会被收集。这应该意味着 RunAndSave 和 RunAndCollect 之间的行为没有区别。

0 投票
1 回答
1553 浏览

c# - 与常规垃圾收集相比,.NET Core 中的 AssemblyLoadContext.Unload() 的值是多少?

.NET Core 3.0 引入了 collectible AssemblyLoadContext,它允许调用Unload()方法来卸载上下文中加载的程序集。

根据文档(https://docs.microsoft.com/en-us/dotnet/standard/assembly/unloadability#troubleshoot-unloadability-issues),卸载是异步的,任何对上下文或对象的引用都会阻止上下文卸货。

我想知道如果我失去对 的引用会怎样AssemblyLoadContext,这会导致泄漏(因为我没有更多的上下文可以调用Unload())。测试证明这不会导致泄漏,即使没有Unload()显式调用,也会卸载未使用的程序集:

该测试还表明,使用Unload()在 1 次 GC 会话后卸载上下文,是否Unload()需要 2 次会话才能卸载。但可能只是巧合,并不总是可重现的。

所以,鉴于

  1. 对可收集上下文的任何引用都将阻止它卸载(因此可以Unload()在加载所有您需要在不使用时安排卸载的程序集之后调用)。
  2. 即使没有调用Unload()可收集的上下文,一旦不再使用,它​​也会被卸载。

这种方法的目的是什么,使用和简单依赖GC有什么Unload()区别?Unload()

0 投票
1 回答
24 浏览

c# - 您能否动态加载与当前加载的项目关联的 DLL,然后让 Visual Studio 调试器中断

我希望能够有一个解决方案

  1. 项目 A 不引用项目 B
  2. 我点击 build all 构建项目 A 和项目 B
  3. 项目 A 运行并动态加载 2. 通过 Assembly.Load 内置的 DLL
  4. 项目 B 中有一个断点,与它关联的 IL 将在其中运行

这可能吗?