如何从另一个DLL中的对象获取类型

本文关键字:对象 获取 取类型 DLL 另一个 | 更新日期: 2023-09-27 18:10:14

我有一个名为"Communication"的对象,它有一个方法来"CreatePdfFromTemplate"。这个方法将从一个对表有sqldependency的Windows服务中调用,当一个方法在一个网站上添加了一个新行时,这个表将通知。

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

我现在在第一个障碍上摔倒了。作为第一步,我试着做以下事情:

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

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

我以前从未使用过反射,所以如果你对它有任何建议,或者对我选择构建这种方式的任何建议(即网站将行添加到DB表,Windows服务中的sqldependency触发,调用通信服务DLL创建PDF)。

只是给你一些更多的信息,我之所以选择这样做,是因为我的模板包含标签,如{指令。其中"Instruction"是对象的名称,"CreatedDate"是属性的名称,该属性的值将替换标签。

关于如何加载这个"指令"对象在我的反射或只是在我的结构一般是非常感激的任何帮助。如果我没有给出足够的信息,或者如果我说的不够清楚,请告诉我(这是我的第一个StackOverflow问题,尽管我是一个长期潜伏者)。

谢谢。

——更新

好的,使用从Maarten提出的想法,我已经设法加载我的程序集并从中获得一个类型,但我做的稍微不同。我无法使用程序集放入特定的路径。LoadFile方法,所以我是这样做的:

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

之所以有效,是因为我试图获得的类型是我的通信服务中称为"Common"的引用程序集的一部分(这是一个使用nuget帮助保持最新的安装包,因为它经常更改)。

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

如何从另一个DLL中的对象获取类型

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

使用Assembly.GetType获取类型。

使用激活器。创建实例,一旦你有了类型。

将其强制转换为dynamic,然后调用你的方法,或者设置你的属性。我假设你使用的是。net 4.0。

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