问题标签 [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.
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 应用程序的情况下解决此问题?
c# - 调用 TypeBuilder.CreateType() 的目的是什么
我很难理解创建动态程序集,下面是一些代码:
所以我的问题是,为什么我们需要调用helloWorldClass.CreateType();
来创建一个类型?
因为我们通常会在 main 方法中得到一个类型:
所以我们可以动态获取类型?
编辑:有人说Type.GetType 返回现有的元数据。AssemblyBuilder.CreateType 引入了新的元数据。
所以所有的TypeBuilder.DefineMethod
,TypeBuilder.DefineField
等都TypeBuilder.DefineConstructor
不会“引入”元数据?在旅途中自动调用“写入”或“引入”元数据不是更明智TypeBuilder.DefineXXX
,因此不再需要 AssemblyBuilder.CreateType() 吗?
c# - 当 .NET 可收集程序集被垃圾收集时是否会触发事件(例如,使用 RunAndCollect 发出的程序集)
当 .NET 可收集程序集被垃圾收集时是否会触发事件(例如,使用 RunAndCollect 发出的程序集)。AppDomain.AssemblyLoad 事件之类的东西?
c# - 使用 RunAndCollect 而不是 RunAndSave 时出现 CLR 错误
当动态生成程序集时,我们经常会得到这个异常:
托管调试助手“FatalExecutionEngineError”消息=托管调试助手“FatalExecutionEngineError”:“运行时遇到致命错误。错误地址位于线程 0x25ac 上的 0xa3851e22。错误代码为 0xc0000005。此错误可能是 CLR 中的错误或用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM-interop 或 PInvoke 的用户封送错误,这可能会损坏堆栈。
在加载 CLR 符号时,它总是与此调用堆栈一起抛出:
当 AssemblyBuilderAccess 设置为 RunAndSave 时不会发生此问题,但将其设置为 RunAndCollect 时会可靠地发生。它总是被抛出这个调用堆栈。RunAndCollect 是否存在 CLR 错误?据我们所知,我们持有对这些动态程序集的 Assembly 和 Module 反射对象的引用,这意味着它们永远不会被收集。这应该意味着 RunAndSave 和 RunAndCollect 之间的行为没有区别。
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 次会话才能卸载。但可能只是巧合,并不总是可重现的。
所以,鉴于
- 对可收集上下文的任何引用都将阻止它卸载(因此可以
Unload()
在加载所有您需要在不使用时安排卸载的程序集之后调用)。 - 即使没有调用
Unload()
可收集的上下文,一旦不再使用,它也会被卸载。
这种方法的目的是什么,使用和简单依赖GC有什么Unload()
区别?Unload()
c# - 您能否动态加载与当前加载的项目关联的 DLL,然后让 Visual Studio 调试器中断
我希望能够有一个解决方案
- 项目 A 不引用项目 B
- 我点击 build all 构建项目 A 和项目 B
- 项目 A 运行并动态加载 2. 通过 Assembly.Load 内置的 DLL
- 项目 B 中有一个断点,与它关联的 IL 将在其中运行
这可能吗?