在运行时使用引用的程序集编译

时间:2016-12-16 11:09:05

标签: c# dynamic-assemblies

我创建了一个函数来编译内存中字符串中的C#代码并在运行时使用它。它运作得很好。

接下来,我创建了一个小类库(让我们称之为mynew.dll)并将其放在c:\ mylibraries \ mynew.dll。

在我的代码中,我可以添加引用的程序集。我是这样做的:

CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters
{
    GenerateExecutable = false,
    GenerateInMemory = true
};

parameters.ReferencedAssemblies.Add(@"c:\mylibraries\mynew.dll");

CompilerResults results = provider.CompileAssemblyFromSource(parameters, mycode);

现在,我的C#代码字符串(mycode)是一个名为" Execute"的函数。当我在此函数中从mynew.dll声明命名空间和类时,我收到此错误:

  

无法加载文件或程序集' MyNew,Version = 1.0.0.0,   Culture = neutral,PublicKeyToken = null'或其中一个依赖项。该   系统找不到指定的文件。

当我在主应用程序的bin / debug文件夹中复制dll时突然有效,但我不想要这个。我希望在运行时编译的代码能够使用它,而不是主应用程序。

这是我在发布之前做的:

  • 搜索Stackoverflow
  • 二手谷歌
  • 尝试将dll编译到磁盘而不是内存中。这工作...现在问题是在IIS中锁定了DLL,我无法在不重新启动IIS服务器的情况下将其删除;没有选择,因为代码可以随时改变,当人们在网站上时,我不想重启服务器。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:-1)

使用Directory.GetFiles在文件系统中查找程序集,使用System.Reflection.Assembly.LoadFile加载程序集,然后找到所需的类型。使用将由具体类实现的接口,以避免必须知道具体类型。

此主题应该有所帮助:Finding objects that implement interface from loaded assembly -how to compare types?