通过CodeDom的PDB文件问题

时间:2016-03-17 06:43:53

标签: c# dll plugins dynamic-code

我一直在创建一个插件模型,其中代码将写在服务器上,并且将创建一个dll输出并下载到客户端。

这很有效,但是由于我们还希望对服务器中生成的代码进行调试支持,因此我尝试在客户端上下载以下代码。

 public OutputResponse GetObject(string fileName, string sourceCode)
    {
        string[] assemblies = this.GetAssemblies();

        string codeLanguage = "cs";
        var dllFilePath = Path.Combine(Path.GetTempPath(), fileName + ".dll");
        var pdbFilePath = Path.Combine(Path.GetTempPath(), fileName + ".pdb");


        //Delete Existing file
        if (File.Exists(dllFilePath))
            File.Delete(dllFilePath);
        if (File.Exists(pdbFilePath))
            File.Delete(pdbFilePath);

        Dictionary<string, string> compilerInfo = new Dictionary<string, string>();
        compilerInfo.Add("CompilerVersion", "v4.0");

        CodeDomProvider provider = CodeDomProvider.CreateProvider(codeLanguage, compilerInfo);
        var compilerParameter = new CompilerParameters();
        compilerParameter.WarningLevel = 3;
        compilerParameter.GenerateExecutable = false;
        compilerParameter.GenerateInMemory = false;
        compilerParameter.IncludeDebugInformation = true;
        compilerParameter.CompilerOptions = "/debug:pdbonly";
        compilerParameter.TempFiles = new TempFileCollection(Environment.GetEnvironmentVariable("TEMP"), true);
        compilerParameter.TempFiles.KeepFiles = true;
        compilerParameter.OutputAssembly = dllFilePath;


        foreach (var assembly in assemblies)
            compilerParameter.ReferencedAssemblies.Add(assembly);


        var results = provider.CompileAssemblyFromSource(compilerParameter, sourceCode);

        string sourceFile = string.Empty;


        string pdbFile = Path.Combine(Path.GetDirectoryName(results.PathToAssembly), string.Concat(Path.GetFileNameWithoutExtension(results.PathToAssembly), ".pdb"));


        foreach(string file in results.TempFiles)
        {
            var extension = Path.GetExtension(file);
            switch(extension)
            {
                case ".cs":
                    sourceFile = file;
                    break;
            }
        }

        var response = new OutputResponse(results.PathToAssembly, pdbFile, sourceFile);

        return response;
    }

正确生成了dll,我将pdb和源文件重命名为dll名称,并下载到客户端文件夹。

现在,当在插入dll的应用程序中调用方法时,Visual Studio无法附加调试器。它说“在此文件夹中找不到匹配的符号文件”。

任何人都可以帮我解决这个问题。

0 个答案:

没有答案