问题标签 [assembly.reflectiononly]

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 投票
5 回答
34325 浏览

c# - C# Assembly.Load 与 Assembly.ReflectionOnlyLoad

我试图了解 Assembly.Load 和 Assembly.ReflectionOnlyLoad 之间的区别。

在下面的代码中,我试图查找给定程序集中从给定接口继承的所有对象:

这段代码对我来说很好,但我正在研究其他可能更好的替代方案,并遇到了 Assembly.ReflectionOnlyLoad() 方法。

我假设由于我没有加载或执行任何对象,基本上只是查询它们的定义,我可以使用 ReflectionOnlyLoad 来稍微提高性能......

但事实证明,当我将 Assembly.Load 更改为 Assembly.ReflectionOnlyLoad 时,它调用 assembly.GetTypes() 时出现以下错误:

无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。

我假设上面的代码只是在做反射和“查看”库......但这是否是海森堡不确定性原则的某种实例,即查看库和其中的对象实际上是试图在某些情况下实例化它们方式?

谢谢,马克斯

0 投票
3 回答
8901 浏览

c# - 为什么在尝试 Assembly.ReflectionOnlyLoad 时未执行 ReflectionOnlyAssemblyResolve?

我正在尝试通过挂钩AppDomain.AssemblyResolveAppDomain.ReflectionOnlyAssemblyResolve事件来加载一些模块。当我让前者工作时,我在后者上失败了。我把我的问题归结为这个小程序:

FileNotFoundException尝试运行此程序失败Assembly.ReflectionOnlyLoad,但它不调用 ReflectionOnlyAssemblyResolve 处理程序。我很困惑。

有谁知道这可能是什么根本原因以及如何让它发挥作用?

谢谢!

0 投票
2 回答
1556 浏览

silverlight - 通过反射获取 mscorlib 2.0.5.0(又名 Silverlight mscorlib)中的类型?

我正在尝试将 Silverlight 支持添加到我最喜欢的编程语言 Nemerle。

Nemerle,在编译过程中,通过反射主要分两步加载所有类型

1-) 使用 Assembly.LoadFrom 加载程序集 2-) 使用 Assembly.GetTypes() 获取类型

然后在编译结束时,它使用 Reflection.Emit 发出解析的类型。

此过程适用于所有程序集,包括 Silverlight 程序集,除了 silverlight 的 mscorlib。

在 c# 中,这失败了:

但这通过了:

Bu 在后者中,a.GetTypes() 抛出异常说 System.Object 的父级不存在。

有出路吗 ?

0 投票
1 回答
3996 浏览

c# - 使用 Assembly.ReflectionOnlyLoadFrom 加载 WPF 项目引用的程序集时出现奇怪的 FileLoadException

我有一个自定义 MSBuild 任务,它可以在程序集中查看一些属性元数据。

我们的自动化构建/发布过程使用了这一点,并且与类库、控制台应用程序和 Web 项目使用和引用的程序集完美匹配。在另一个 MSBuild 进程编译项目后调用 MSBuild 任务。

昨天当我添加一个引用这个特定程序集的 WPF 项目时它停止工作 - 一个 .NET 3.5 类库。

我知道它与 WPF 相关,因为如果我将 AssemblyFile 更改为指向 WPF 项目未引用的同一解决方案中的另一个程序集,则不会引发异常。

异常消息提到

... already loaded from a different location.

It cannot be loaded from a new location within the same appdomain.

请注意有关相同应用程序域的部分。

所以我修改了代码来捕捉这个特殊的异常并查看 CurrentDomain:

不用说,有问题的程序集不在当前域中(这可能是有道理的,因为产生了另一个 MSBuild 进程来进行编译),所以假设错误消息是真的,我该如何弄清楚在哪里它活着?这很令人困惑,因为给我的错误消息表明它应该是 CurrentDomain。

或者有更多 WPF 经验的人可以解释为什么这个程序集在成功构建后仍然在应用程序域中浮动?

这是其他遇到此异常的人提出的另一个问题。

0 投票
2 回答
1107 浏览

c# - 无法反映共享不同版本依赖项的程序集

这是使用Assembly.ReflectionOnlyLoadFrom的场景:

我的 assembly Inspected和我的反射 Application Inspector都引用了 Assembly Dependency

如果Inspector引用Dependency 1.0.0.0并且Inspected引用Dependency 1.1.0.0,则Inspector无法反映 Inspected 中使用 Dependency 类型的任何类型方法。当这种类型被击中时,我得到:

System.IO.FileLoadException:无法加载文件或程序集“依赖项,版本=1.1.0.0,文化=中性,PublicKeyToken=null”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)

但是,Inspector可以很好地反映Dependency 1.1.0.0本身,因此将Dependency 1.1.0.0加载为Assembly.ReflectionOnlyLoadFrom确实可以从已经使用Dependency 1.0.0.0的程序集中工作。

这是我用来加载程序集并预加载它的依赖项的代码:

这不是Dependency 1.1.0.0未解决的问题,因为我在 foreach 中设置了一个断点并确认它已加载并检查AppDomain.CurrentDomain.ReflectionOnlyGetAssemblies()是否存在。加载好了。但是当我然后做assembly.GetTypes()时,它就死了。

对此我可以做些什么,或者我是否必须在单独的 AppDomain 中反映程序集并将元数据编组回引用Dependency 1.0.0.0的 appdomain ?

0 投票
1 回答
152 浏览

reflection - 获取程序集中的类型:ReflectionTypeLoad Exception

可能重复:
如何可重现地导致/引发 ReflectionTypeLoadException?

我想在加载的程序集中获取所有类型。代码片段如下

当我运行时,我得到了 ReflectionTypeLoadException。代码中的错误是什么。

0 投票
1 回答
80 浏览

dll - 使用 dll 中的参数和调用方法创建实例

我正在加载一个 dll,创建一个实例并想要调用方法并检查返回值。创建实例时出现异常 {"Parameter count mismatch."}:

问:1.我做错了什么?2. 如何获取方法、调用它并获取返回值?3. 有没有更好的方法来做到这一点?

0 投票
1 回答
783 浏览

c# - 从引用的 dll/程序集中读取类型详细信息

我有两个 dll 文件让我们说 DataLayer.dll 和 ProcessLayer.dll。DataLayer.dll 有一个名为 MyClass 的类,如下所示:

我已经在第二个程序集 ProcessLayer.dll 中引用了 DataLayer.dll,它有一个输入参数为 MyClass 的方法。

如何ProcessLayer.dll使用反射读取所有方法参数?我在用

并在尝试执行 method.GetParameters();语句时出错。

你能帮我么 ?

如何使用 Mono.cecil 获得它有什么想法吗?

0 投票
3 回答
9297 浏览

c# - 在 ReflectionOnly 模式下将程序集加载到新的 AppDomain 时,方法没有实现

在我们的应用程序(包含 65 个项目的解决方案)中,所有引用的程序集都在运行时分析是否存在 Ninject 模块(也应用了一些过滤)。这些模块稍后会加载到 Ninject 内核中,并且每个模块都为内核声明绑定。

我们采用了一个加载器,它以仅反射模式将引用的程序集加载到单独的程序集中。与 Ninject 可以从目录加载程序集的方式不同的是,该目录可以包含带有不应加载的模块的程序集。而且在开始时,并非所有引用的程序集都已加载。

问题是加载程序(归功于 Sacha Barber)无法加载某些程序集

LoaderExceptions一个条目:

以下是一些“有趣”的事实:

  • 方法BeforeLoad是虚拟的,并且是接口方法的实现
  • 上周加载程序异常说不同的方法没有实现(该方法不是虚拟的),后来,当我明确实现它时,消息说找不到该方法。
  • 上周程序集的目标框架AppBaseCore是 .NET 3.5 和 3 个程序集未能加载
  • 现在程序集的目标框架AppBaseCore是 .NET 4 和 5 程序集未能加载
  • 应用程序一切正常,否则

当我用 ILSpy 和 ILDAsm 检查它们时,这些程序集没有任何问题(显然)。

在这一点上,我真的很迷茫,不知道如何解决这个问题。

任何帮助表示赞赏。

谢谢

0 投票
0 回答
405 浏览

c# - C# Assembly.ReflectionOnlyLoad 有多轻巧

我有许多程序集,我在 Unity 游戏中将它们视为库。游戏开始时,我想快速读取所有文件的清单 - 将来某个时候可能会有 50 多个 - 并在内存中列出一个列表。

我在版权和产品信息字段中打包了一些足以阅读的有用信息,但我当然不想将整个程序集加载到我的应用程序域或任何其他应用程序域中。

AssemblyName.GetAssemblyName 似乎是最轻量级的

但无济于事,因为它只提供程序集名称、版本和文化信息。这些无论如何都不能有自定义字符串(如果我使用 AssemblyInfo.cs 中的代码强制其中一些自定义字符串,则程序集无法编译)

所以这让我想到了最后一个选项,即 Assembly.ReflectionOnlyLoadFrom

这实际上会加载整个文件吗?这对我来说太多了,因为我只想要属性。

如果是这样,那么我别无选择,只能自己在汇编文件中添加一些额外的字节,并在将字节数组交给之前删除这些字节