【问题标题】:Can someone explain me the functionality of the Assembly Class to me?有人可以向我解释一下组装类的功能吗?
【发布时间】:2012-09-22 17:35:45
【问题描述】:

我想在运行时加载和创建程序集,有人告诉我使用命名空间 System.Reflection.Assembly 和 System.Reflection.Emit。

我找到的唯一参考资料是在 msdn 上,但是当您不知道从哪里开始以及如何开始时,使用它就不那么好了。我已经用谷歌搜索了,但没有找到任何有用的教程/示例/参考。

有人可以向我解释一下这个功能或给我一些示例/教程吗?

【问题讨论】:

  • 你能说一下为什么要加载程序集吗?其他技术可能会提供更好的方法。一旦你加载了一个程序集,你将无法卸载它,如果你在加载它的方式上不聪明,你会将文件锁定在磁盘上。有很多陷阱,从为什么开始,让人们提出机制。
  • @DJKRAZE:你看不懂吗?当您不知道从哪里以及如何开始处理此问题时,msdn 上的参考并不是那么好......
  • 您可能要问的是:我希望能够加载程序集并在其中创建给定类型的实例。
  • @Paedow:您是否向下滚动到那篇 msdn 文章的末尾?有一些介绍性文字和一个实际上看起来相当不错的示例。
  • @MikeMiller:我想使用程序集类来动态生成一个插件库,它写在硬盘上,这样我的客户端可以将它上传到我的 ftp 服务器上的存档,另一个客户端可以浏览 ftp 存档并下载插件,然后在运行时加载

标签: c# .net dynamic runtime .net-assembly


【解决方案1】:

http://msdn.microsoft.com/en-us/library/saf5ce06.aspx

 public static void CompileScript(string source)
        {
            CompilerParameters parms = new CompilerParameters();
            parms.GenerateExecutable = true;
            parms.GenerateInMemory = true;
            parms.IncludeDebugInformation = false;
            parms.ReferencedAssemblies.Add("System.dll");
            // Add whatever references you might need here 
            CodeDomProvider compiler = CSharpCodeProvider.CreateProvider("CSharp");
            CompilerResults results = compiler.CompileAssemblyFromSource(parms, source);
            file.move(results.CompiledAssembly.Location,"c:\myassembly.dll");
        }

【讨论】:

  • 好的,这是一件好事,但我怎样才能将程序集作为 dll 文件保存在我的硬盘上?
  • 您可以将 GenerateInMemory 翻转为 false,然后在 CompilerResults 类中有一个位置,它将位于临时文件夹中,您可以将其重命名并将其移动到您想要的任何位置
  • 好的,这就是我想要的...请您编辑问题以使其适合您的答案吗?
  • 如果你想卸载同一个程序集,你需要在另一个应用程序池中加载它
【解决方案2】:

从源文件创建程序集的一种可能方法是简单地运行 CSC(C# 命令行编译器),将源文件和引用作为参数传递。手动生成 IL 可能太先进了,尤其是如果您想从其他人提供的代码构建程序集。

要加载 - 使用 Assembly.Load。

【讨论】:

  • 但这也可能是程序化的
  • @Paedow,当然 - 查看 Process.Start。 Micah Armantrout (+1) 答案更好。
猜你喜欢
  • 1970-01-01
  • 2014-04-20
  • 2011-04-24
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 2019-11-28
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多