问题标签 [assembly.load]

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 投票
2 回答
1395 浏览

.net - Assembly.Load(Byte[]) 和 Assembly.Location/Assembly.Codebase

我正在尝试加载程序集而不锁定文件。这些程序集可能是第三方程序集,因此我们不一定有权访问代码,其中一两个使用 Assembly.Location 从它们的目录中读取文件,这些文件可能依赖于它们。

我知道你可以通过影子复制来做到这一点,但让它正常工作真的很痛苦,某些论坛上的一些用户建议将程序集加载到字节数组中并使用 Assembly.Load(Byte[]) 重载。这在其中一个程序集尝试访问其父目录中的文件之前非常有效,因为 Assembly.Location 返回一个空字符串,而 Assembly.Codebase 返回加载程序集的应用程序的位置。

我能做些什么来以某种方式设置我正在加载的程序集的 Codebase 或 Location 属性吗?在 Codebase 和 Location 的 MSDN 文档中,它们被定义为可覆盖的属性——这是否意味着我可以从托管应用程序中覆盖它们?

0 投票
1 回答
237 浏览

.net - TestDriven.NET 下的测试没有获取更新的 fuslogvw 设置

如果有这个重复,我会支持它,但直到有人为我找到它......这是我今天学到的东西[似乎没有人在博客上写过]条目......

使用 TestDriven.NET,我不断地从以下输出Assembly.Load

警告:程序集绑定日志记录已关闭。

要启用程序集绑定失败日志记录,请将注册表值 >[HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) 设置为 1。

注意:有一些与程序集绑定失败日志相关的性能损失。

要关闭此功能,请删除注册表值 [HKLM\Software\Microsoft\Fusion!EnableLog]。

所以我加载了 fuslogvw,因为我在 x64 系统上,甚至尝试了相同的 x64 版本,但无论我重试多少次,都无法让它显示日志。我验证了注册表中的设置,一切似乎都应该是 -EnableLog已设置,但重新运行仍然没有乐趣。

0 投票
1 回答
5260 浏览

c++-cli - 从 C++/CLI 加载相互依赖的程序集

我想从 C++/CLI 加载两个程序集;程序集 A 依赖于程序集 B,两者都是 VB.Net 项目(3.5)。我希望它们从字节数组加载,所以我使用 Assembly::Load(),但是当我尝试从程序集 A 实例化一个类时,框架会忽略先前加载的程序集 B 并尝试再次加载它,但失败是因为它不在搜索路径中。程序集的“名称”是相同的,所以我不知道它为什么会失败。出于测试目的,我的程序直接从编译后的图像中加载字节,但实际代码的加载方式会有所不同。这是我的测试代码:

错误是:

无法加载文件或程序集“ AssemblyB、Version=1.0.3650.39903、Culture=neutral、PublicKeyToken=null ”或其依赖项之一。该系统找不到指定的文件。

当我检查 assemblyb->FullName 时,它​​准确地说是“ AssemblyB, Version=1.0.3650.39903, Culture=neutral, PublicKeyToken=null ”。

当然,如果我将 AssemblyB.dll 复制到我的测试程序的文件夹中,代码就可以正常工作,但这不是我想要的。

有任何想法吗?

(顺便说一句,我的第二步是尝试让 AssemblyA 使用我的 C++/CLI exe 将公开的类。)

0 投票
1 回答
1599 浏览

.net - 如何解决 Assembly.Load 性能下降?

我正在重构一些代码,但我陷入了两难境地。

假设我们有以下场景:

  1. 包含许多通用接口和类的核心程序集
  2. 包含更专业类的库程序集。

库程序集引用核心程序集。到现在为止还挺好。

由于我正在重构它,核心程序集需要创建在库程序集中声明的对象。

好的,为了避免循环引用问题,我决定在需要时加载库程序集(并且仅在类型初始化的非常特定的点需要它)。

然而,整件事情的加载性能却直线下降到了一个黑暗的深渊……

有谁知道如何解决这个问题?


编辑添加

有些人要求我用来加载的代码......这真的很简单。

0 投票
1 回答
1231 浏览

.net - Assembly.Load* 的奇怪问题

我从文件加载程序集时遇到奇怪的问题,不幸的是我无法用简单的易于共享的代码重现它。我在下面描述了我正在做的事情。

我有 4 个应用程序:

  1. “Complex Invoker” - 外国(不是我的)开源应用程序,实际上是电脑游戏,我正在为此编写插件。此应用程序可以从 dll 调用多个函数(请参阅下面的代理定义)。为简单起见,它调用了 3 个函数 init(); 发布(); 做一点事(); 实际名称略有不同,但没关系。复杂的调用程序是用纯非托管 c\c++ 编写的,并用 MSVC 编译。

  2. “Simple Invoker” - 我从头开始编写的应用程序,用于测试问题(见下文)是否以任何方式发生。它的作用相同 - 调用 3 个函数,就像在 Complex Invoker 中一样。简单的调用程序是用纯非托管 c\c++ 编写的,并用 MSVC 编译。

  3. “代理” - 两个调用者都调用的 dll。它导出函数 init(); 发布(); 做一点事(); 调用者调用它们。这里的另一部分是由 init() 函数调用的托管 (CLR) 部分。实际托管类用于调用 Assembly.Load(Byte[],Byte[]); 此函数调用从文件(见下文)加载程序集以从该程序集中实例化类。来自程序集的类实现接口“SomeInterface”,该接口也在“Proxy”中定义(“Assembly”引用了“Proxy”)。代理是在带有 /clr 标志的 MSVC 中以混合模式(托管+非托管)C++ 编写的。

  4. “Assembly”是具有单个类的 dll(托管程序集),它从 Proxy 实现“SomeInterface”。它非常简单,用 c# 编写。

现在这是我的目标。我希望调用者(特别是复杂的)调用代理,代理依次加载程序集并调用类(在程序集中)实例中的函数。关键要求是能够按需“重新加载”程序集,而无需重新执行 Invoker。Invoker 具有指示需要重新加载到 Proxy 的机制,而后者又为 Assembly.dll 执行 Assembly.Load(Byte[],Byte[])。

所以现在是问题所在。它与“Simple Invoker”配合得很好,但不能与“Complex Invoker”配合使用!使用简单调用程序,我能够“重新加载”(实际加载程序集的数量)超过 50 次,使用“复杂调用程序”,Assembly.Load() 方法在第一次尝试重新加载程序集时失败,即代理加载大会第一次并未能按需重新加载。有趣的是,简单加载器和复杂加载器执行完全相同的函数调用流程,即 LoadLibraryA("Pathto\Proxy.dll"); GetProcAddress 用于 init、release、handleEvent;调用这些函数;之后是 FreeLibrary()。而且我看到了复杂调用程序和 .NET 库之间的互操作问题(不知道是什么样的)。Complex Invoker 的代码中有一些东西破坏了 MS 。NET 正确性。我 99% 确定这不是我作为程序员的错。

就在我更深入地了解我遇到的异常以及我为克服这些问题(例如使用 AppDomains)而采取的方法之前,我想澄清一下这个论坛上的某个人是否有能力、时间和意愿深入研究系统。 Load() 内部(即这应该是具有 System 和 System.Reflection 源的那个)。这将需要安装“Complex Invoker”以及 Proxy 和 Assembly(不要认为这是太艰巨的任务)。

我在这里发布相关的代码片段。

调用者简单

CSProxyInterface(代理)

标准数据文件

stdafx.cpp

包装类.h

包装类.cpp

最后是 Assembly.dll

如果一个人设法编译所有 3 个项目,它就会工作。这是简单的调用者场景。

我还有一个开源游戏,它的功能与 Simple Invoker 中的完全一样。但是在请求重新加载之后(调用了handleEvent(0, 4, NULL))我在Assembly::Load(Byte[],Byte[]) <--你可以在代理代码中找到它

异常如下所示:

内部异常:

为了尽可能准确,这段代码确实适用于简单的 Invoker 场景,并且在复杂的场景中运行一次(第一次 Init)。


不幸的是,我似乎并没有像我应该做的那样清楚。我会再试一次。

想象一下,你有一个“黑匣子”正在做某事,它是我的 proxy.dll。它加载 assembly.dll,从程序集中实例化类对象并运行它。

黑盒子有一个外部接口,这些函数是init、release、DoSomething。如果我用简单的应用程序(没有线程,没有网络代码,没有互斥体,关键部分等)触摸这个界面,整个构造就可以工作。这意味着黑匣子做得很好。在我的情况下,我能够“重新加载”程序集多次(50 次)更具体。另一方面,我有一个复杂的应用程序,它执行完全相同的调用流程。但不知何故,它干扰了 CLR 的工作方式:黑盒内的代码停止工作。复杂的应用程序具有线程、tcp/ip 代码、互斥体、boost 等。很难说究竟是什么阻止了应用程序和 Proxy.dll 之间的正确行为。这就是为什么我要问是否有人看到了 Assembly.Load 内部发生的事情,因为当我'

0 投票
1 回答
642 浏览

c# - ASP.NET 从父应用程序加载程序集

我有一个网站,其中有一个网站管理应用程序。

可以在管理应用程序中从网站加载程序集吗?

例如:

替代文字

WebAdmin 项目(Web 应用程序):在 default.aspx 中,我想加载程序集 ClassLibrary1.dll 并创建 ImportProvider 类型的实例。WebAdmin 没有对 ClassLibrary1 的引用。

IIS 中的配置:

替代文字

应用程序目录“admin”(WebAdmin 项目)在 Website1

非常感谢

0 投票
3 回答
843 浏览

c# - 如何通过互联网动态加载程序集?

有没有办法或库可以帮助我将程序集加载到位于我网页上的内存中(例如 dll)。我正在尝试找出一个不错的防裂保护

0 投票
1 回答
2154 浏览

c# - 从特定路径加载强名称程序集?

我有一个强命名程序集,安装到特定文件夹(而不是 GAC)。

Reflector 中显示的名称为:

它的安装路径是

我可以使用Assembly.LoadAssembly.LoadFrom加载它吗?如果可以,如何加载?

我能否确保尊重强命名,即我正在加载的 DLL 确实是我所期望的,而不是同名的冒名顶替者?

0 投票
1 回答
982 浏览

c# - C#“Assembly.LoadFile”并在加载的程序集中禁用“DllImport”?

在 C# 中,是否可以在运行时动态加载 .NET 库,使用类似System.Reflection.Assembly.LoadFile& 禁用加载的库,[DllImport("someCPP.DLL", EntryPoint ="someFunction")]以便出于安全原因不能调用 c++ 的东西?


这个问题的原因是我正在考虑制作一个通用的开源浏览器插件,它可以运行任何 .NET 代码并显示诸如 OpenGL 或 Direct3D 之类的东西,或者使用 .NET 在浏览器中显示你想要的任何内容。这需要通过禁用“DllImport”和其他一些东西来确保加载的 .NET 库是安全的。这可能吗?

0 投票
2 回答
1962 浏览

c# - Assembly.Load 是否使用缓存?

我有一个资源程序集,其中存储了许多可重用的脚本、样式和控件。我不确定是否应该在加载此程序集后对其进行缓存。Assembly.Load 是否在同一个应用程序域中使用内部缓存?

谢谢!