2013-04-22 45 views
2

我有一个名为“Communication”的对象,它有一个“CreatePdfFromTemplate”方法。该方法将从Windows服务中调用,该服务在表上具有SqlDependancy,当网站上的方法添加新行时将通知该服务。如何从另一个DLL中的对象获取类型?

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

我目前正处于第一个障碍。我试图做到以下几点作为第一步:

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

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

我从来没有使用过反射之前,所以如果你有任何意见,或任何建议的方式,我已经选择了一般的结构(即网站添加行数据库表,SqlDependancy在Windows服务火灾,调用通讯服务DLL创建PDF)。

只是为了提供更多信息,我选择这样做的原因是因为我的模板包含{Instruction.CreatedDate}等标签,其中“Instruction”是对象的名称,“CreatedDate”是一个属性的名称,它的值将替换标签。

任何帮助如何加载这个“指令”对象在我的反射或只是在我的结构一般是非常感谢。让我知道如果我没有给出足够的信息,或者我所说的不够清楚(这是我的第一个StackOverflow问题,虽然我很长时间潜伏着)。

谢谢。

--UPDATE--

好了,使用这个想法从马腾提出,我已成功地加载我的组装和从它那里得到一个类型,但我已经稍有不同做了。我是不是能够把使用Assembly.LoadFile方法的具体路径,所以我已经做了这样的:

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

这工作,因为该类型我试图让,是一个参考的一部分汇编在我的通讯服务中称为“Common”(这是一个使用nuget安装的软件包,以帮助保持最新,因为它经常变化)。

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

+0

如何获得其他程序集?它们位于哪里,它们是如何提供的?它们是否会在应用程序运行时更新?如果程序集已更新,是否可以重新启动应用程序? – cremor 2013-04-22 12:56:48

回答

3

使用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; 
} 
+0

感谢您的信息。但是,如果我使用Assembly.LoadFile,则必须提供路径引用,并且我引用的DLL经常更新。在这种情况下,是否最好在程序包中添加nuget参考(我们在整个站点中已经使用nuget),并直接在我的服务bin目录中引用DLL? – yellowbrickcode 2013-04-22 12:09:51

相关问题