使用C#,我在运行时创建了一个DLL,现在我想在运行时添加它作为对项目的引用。
我尝试使用LoadFrom
方法,但它不起作用。
我该怎么做?
答案 0 :(得分:25)
首先你应该加载dll
Assembly assembly = Assembly.LoadFrom("dllPath");
然后,您可能需要将程序集添加到应用程序域
AppDomain.CurrentDomain.Load(assembly.GetName());
之后,您可以从此程序集中加载任何类型
Type t = assembly.GetType("typeName");
然后使用反射,您可以在此类型上执行方法
请注意,您可能需要在配置文件中添加以下内容。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="dlls folder"/>
</assemblyBinding>
</runtime>
答案 1 :(得分:8)
LoadFile与LoadFrom
小心 - 这些不一样 的事情。
LoadFrom()通过Fusion而且可以 被重定向到另一个组件 不同的路径,但同样的道路 身份如果已加载 LoadFrom上下文。的LoadFile() 根本没有通过Fusion绑定 - 装载机只是前进并加载 正好*调用者要求的内容。它 不使用Load或 LoadFrom上下文。所以,LoadFrom() 通常会给你你所要求的, 但不一定。 LoadFile()用于 那些真正非常想要的人 什么是要求。 (*但是,开始 在v2中,政策将适用于两者 LoadFrom()和LoadFile(),等等 LoadFile()不一定是 究竟是什么要求。也, 从v2开始,如果是一个程序集 它的身份在GAC中,即GAC 将使用副本。使用 ReflectionOnlyLoadFrom()加载 正是你想要的 - 但是,请注意 以这种方式加载的程序集不能 执行。)
LoadFile()有一个catch。既然如此 它不使用绑定上下文 依赖关系不是自动的 在其目录中找到。如果他们不是 你可以在Load上下文中找到它 必须订阅 AssemblyResolve事件以便绑定 他们。
答案 2 :(得分:4)
使用Assembly.LoadFile方法,然后使用反射在其中运行代码。
答案 3 :(得分:2)
实际上Assembly.Load
是usually what you'd want,而不是LoadFrom
而不是LoadFile
:
哪种情况适合您?在 一般来说,我强烈建议你 尽可能使用Load上下文
http://blogs.msdn.com/b/suzcook/archive/2003/05/29/57143.aspx
答案 4 :(得分:1)
项目已在运行时,无法将dll添加到项目中。但是,您可以使用Assembly.LoadFrom(filename)加载dll。通常,此类scenerio用于SOA或基于插件的项目。您可以使用interface指定类型结构并加载dll并使用它。
答案 5 :(得分:0)
您可以使用Assembly.LoadFrom方法在运行时动态加载程序集。
答案 6 :(得分:0)