【问题标题】:How to get a Type from an object in another DLL?如何从另一个 DLL 中的对象获取类型?
【发布时间】:2013-04-15 05:28:19
【问题描述】:

我有一个名为“Communication”的对象,它有一个“CreatePdfFromTemplate”方法。此方法将从 Windows 服务中调用,该服务在表上具有 SqlDependancy,该表将在网站上的方法添加新行时通知。

在我的方法中,我传递了一个具有“Id”和“Name”的自定义对象列表。该名称是我需要使用反射加载的对象的名称。例如,“指令”。 “Id”是需要从数据库加载的“Name”中引用的对象的Id。此对象在我的“通信”DLL 的运行时中未被引用或可用。

我目前正处于第一个障碍。作为第一步,我正在尝试执行以下操作:

// Load object information using Reflection
Type objectType = Assembly.GetExecutingAssembly().GetType(queueObject.Name);
int objectId = queueObject.Id;

我在搜索答案时发现了一些信息,这些信息表明可以通过在应用程序缓存或 GAC 中提供 DLL 来加载 DLL,但我不确定这是否是最好的方法。

我以前从未使用过反射,所以如果您对它有任何建议,或者对我选择的一般结构方式有任何建议(即网站向数据库表添加行,Windows 服务中的 SqlDependancy 触发,调用用于创建 PDF 的通信服务 DLL)。

只是为了给您更多信息,我之所以选择这样做,是因为我的模板包含诸如 {Instruction.CreatedDate} 之类的标签,其中“Instruction”是对象的名称,“CreatedDate”是属性的名称,其值将替换标记。

非常感谢任何有关如何在我的反射中或仅在我的结构上加载此“指令”对象的帮助。如果我没有提供足够的信息或者我说的不够清楚,请告诉我(这是我的第一个 StackOverflow 问题,虽然我是一个很长一段时间的潜伏者)。

谢谢。

--更新--

好的,使用 Maarten 提出的想法,我已经设法加载我的程序集并从中获取一个类型,但我的做法略有不同。我无法使用 Assembly.LoadFile 方法输入特定路径,所以我这样做了:

Assembly executingAssembly = Assembly.GetExecutingAssembly();
Assembly objectAssembly = Assembly.Load(executingAssembly
                                          .GetReferencedAssemblies()
                                          .Where(a => a.Name == "Common")
                                          .FirstOrDefault());

这是有效的,因为我尝试获取的类型是我的通信服务中名为“Common”的引用程序集的一部分(这是一个使用 nuget 的已安装包,以帮助保持最新,因为它经常更改) .

任何关于我如何做到这一点以及它的正确或错误方式的进一步帖子将不胜感激!

【问题讨论】:

  • 如何获得其他组件?它们位于何处以及如何提供?它们会在您的应用程序运行时更新,还是如果程序集更新,是否可以重新启动应用程序?

标签: c# object reflection gettype


【解决方案1】:

使用Assembly.LoadFile 或其他重载加载程序集。

使用Assembly.GetType获取类型。

一旦你有了类型,就使用Activator.CreateInstance

将其转换为dynamic,并调用您的方法,或设置您的属性。我假设您使用的是 .net 4.0。

var myAssembly = Assembly.LoadFile(...);
var myType = myAssembly.GetType(...);
dynamic myObject = Activator.CreateInstance(myType);
if (myObject != null) {
    var createdDate = myObject.CreatedDate;
}

【讨论】:

  • 感谢您的信息。但是,如果我使用 Assembly.LoadFile,我必须提供路径引用,并且我引用的 DLL 经常会更新。在这种情况下,是否最好在包中添加一个 nuget 引用(我们已经在整个站点中使用了 nuget)并直接在我的服务 bin 目录中引用 DLL?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 2010-10-14
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多