CSharpCodeProvider 如何引用当前程序集

CSharpCodeProvider how to reference current assembly

我正在尝试使用 CSharpCodeProvider 动态编译代码。在引用的程序集中,我按照建议 here,为 typeof(Program).Assembly.CodeBase) 添加了一个引用参数,但它不起作用。我仍然收到一条错误消息

error CS0006: Metadata file 'file:///C:/Code/MyProject/bin/MyProject.DLL' could not be found;

确实存在同名文件 - 唯一的区别是文件扩展名在文件资源管理器 (.dll) 中显示为小写,但除此之外,错误消息中的文件名与 dll 的名称和路径相匹配我要参考

知道为什么编译器在这种情况下无法看到引用的 dll 吗?
这是我的代码的相关部分:

        CompilerResults result = null;
        CompilerParameters parms = new CompilerParameters();
        parms.GenerateExecutable = false;
        parms.GenerateInMemory = true;
        parms.OutputAssembly = "MyOutputAssembly";
        parms.ReferencedAssemblies.Add("System.dll");
        parms.ReferencedAssemblies.Add("System.Data.dll");
        parms.ReferencedAssemblies.Add("mscorlib.dll");
        parms.ReferencedAssemblies.Add(typeof(Program).Assembly.CodeBase); // Reference the current assembly

        // Lock because CSharpCodeProvider can only compile the code once per time slot
        lock (lockCompile)
        {
            using (CSharpCodeProvider codeProvider = new CSharpCodeProvider())
            {
                result = codeProvider.CompileAssemblyFromSource(parms, new string[] { code.ToString() });
            }
        }

尝试使用 typeof(Program).Assembly.Location 而不是 .CodeBase。程序集上的 .Location 属性 将 return 到加载的实际文件的 straight-up 路径,而 .CodeBase return 是典型位置以 URI 形式。我不确定,但我认为可能存在与加载 remotely-hosted 代码相关的场景,其中 .Location 不会给你任何东西,而 .CodeBase 可能会给你例如http URI,但在你的场景中,听起来你的程序集总是本地的,所以你应该始终有一个有效的 .Location 值。 :-)