0

我创建了一个函数来编译内存中的字符串中的 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 编译到磁盘而不是内存中。这行得通...现在的问题是 dll 被锁定在 IIS 中,如果不重新启动 IIS 服务器就无法删除它;没有选择,因为代码可以随时更改,当人们在网站上时我不想重新启动服务器。

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

4

1 回答 1

-1

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

这个线程应该有帮助:从加载的程序集中找到实现接口的对象 - 如何比较类型?

于 2016-12-16T12:20:31.160 回答