我有一个名为“Communication”的对象,它有一个“CreatePdfFromTemplate”的方法。此方法将从Windows服务调用,该服务在表上具有SqlDependency,该表将在网站上的方法添加新行时发出通知。
在我的方法中,我传递了一个具有“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,但我不确定这是否是最好的方法。
我以前从未使用过Reflection,所以如果你对它有任何建议,或者对我选择的一般结构方式有任何建议(即网站向DB表添加行,Windows服务中的SqlDependency激发,调用通信服务DLL创建PDF)。
为了给您更多信息,我之所以选择这样做,是因为我的模板包含{Instruction.CreatedDate}等标记,其中“Instruction”是对象的名称,“CreatedDate”是属性的名称,其值将取代标记。
关于如何在我的Reflection中加载这个“指令”对象,或者仅仅在我的结构上提供任何帮助,我们将不胜感激。如果我没有提供足够的信息,或者我说的不够清楚,请告诉我(这是我的第一个StackOverflow问题,尽管我是一个长期潜伏者)。
谢谢
--更新--
好吧,使用Maarten提出的想法,我已经成功地加载了我的程序集并从中获得了一个类型,但我的做法略有不同。我无法使用Assembly.LoadFile方法放入特定的路径,所以我这样做了:
Assembly executingAssembly = Assembly.GetExecutingAssembly();
Assembly objectAssembly = Assembly.Load(executingAssembly
.GetReferencedAssemblies()
.Where(a => a.Name == "Common")
.FirstOrDefault());
这之所以有效,是因为我试图获取的类型是我的通信服务中名为“Common”的引用程序集的一部分(这是一个使用nuget帮助保持最新的安装包,因为它经常更改)。
如果有更多关于我是如何做到这一点的帖子,以及这是正确的还是错误的,我们将不胜感激!