Reference CSharpCodeProvider如何引用当前程序集

Reference CSharpCodeProvider如何引用当前程序集,reference,file-not-found,csharpcodeprovider,Reference,File Not Found,Csharpcodeprovider,我正在尝试使用CSharpCodeProvider动态编译代码。在引用的程序集中,我为typeof(Program.Assembly.CodeBase)添加了一个引用参数,正如建议的那样,但它不起作用。我仍然得到一个错误,说 error CS0006: Metadata file 'file:///C:/Code/MyProject/bin/MyProject.DLL' could not be found; 该名称的文件确实存在-唯一的区别是文件扩展名在文件资源管理器中显示为小写(“.dll

我正在尝试使用CSharpCodeProvider动态编译代码。在引用的程序集中,我为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
属性将直接返回加载的实际文件的路径,而
.CodeBase
将以URI形式返回文件位置。我不确定,但我认为可能存在与加载远程托管代码相关的场景,其中
.Location
不提供任何信息,
.CodeBase
可能提供例如
http
URI,但在您的场景中,听起来您的程序集总是本地的,因此,您应该始终具有有效的
.Location
值。:-)

尝试使用
typeof(Program).Assembly.Location
而不是
.CodeBase
。程序集上的
.Location
属性将返回一个直接向上的路径,而
.CodeBase
以URI形式返回位置。我不确定,但我认为可能存在与加载远程托管代码相关的场景,其中
.Location
不提供任何信息,
.CodeBase
可能提供例如
http
URI,但在您的场景中,听起来您的程序集总是本地的,因此,您应该始终具有有效的
.Location
值。:-)完成,谢谢:-)谢谢!这很有效-如果您添加为答案,我将标记为答案-并检索到与.CodeBase非常不同的路径-CodeBase检索到bin文件夹位置,而Location获得了一个临时目录:C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\Temporary ASP.NET Files\\myIISDirName\\65307448\\ec575f43\\assembly\\dl3\\d46288d9\\3e71eb5a_c275d201\\MyProject.dll。这篇文章()似乎暗示.Location在卷影复制之前提取地址,这让我对位置何时安全感到有点困惑…最后我将使用新的System.Uri(Assembly.getExecutionGassembly().EscapedCodeBase).LocalPath来实现发布的优点,但无论如何,上面的“标记”答案也起到了作用,让我达到了目的!