无法在c#项目中加载dll符号

本文关键字:加载 dll 符号 项目 | 更新日期: 2023-09-27 18:17:04

我有一个主应用程序,它从编译的dll文件加载驱动程序。我遇到了一个问题,我希望能够调试这些dll文件,但符号没有被项目加载。

dll文件是解决方案的一部分,但必须从主应用程序单独构建。然后,主应用程序在运行时从目录加载这些dll。我有一个错误在这些加载的dll文件(不是一个异常,只是意外的结果),但不能调试文件。谁能给我一个关于如何继续调试这些的想法?

编辑:为了更好地理解dll是如何加载的,下面是主项目中的代码:

public List<BaseClass> getObjects(string objectName)
{
    List<BaseClass> availableDrivers = new List<BaseClass>();
    string currentDir = Directory.GetCurrentDirectory();
    currentDir = Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath); //Use this to find path even when running as service
    if (Directory.Exists(currentDir + "''Objects"))
    {
        string[] files = Directory.GetFiles(currentDir + "''Objects", "*.dll");
        foreach (string file in files)
        {
            Console.WriteLine("LOOKING AT:"+ file);
            try
            {
                Assembly dll = Assembly.LoadFrom(file);
                Type[] types = dll.GetTypes();  // .Where(x => x.BaseType.Name == "BaseClass");
                foreach (Type type in types)
                {
                    if (type.BaseType != null && (type.BaseType.Name == "BaseClass" || type.BaseType.Name == "PeriodicBaseClass"))
                    {
                        BaseClass ClassObj = (BaseClass)Activator.CreateInstance(type);
                        if (objectName == "" || objectsName == ClassObj.Name)
                        {
                            availableDrivers.Add(ClassObj);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                Error.Log("Error reading driver:" + e.Message,MessageType.Error);
                //Console.WriteLine("Error reading driver:" + e.Message);
            }
        }
    }
    return availableDrivers;
}

所以正如你所看到的,当我运行程序本身,驱动程序通过检索他们编译的dll文件来加载,当在dll代码中放置断点时,我得到消息说符号不能加载。我试过检查调试>Windows>模块,但由于没有直接在应用程序中加载,dll没有显示在那里。

无法在c#项目中加载dll符号

如果所讨论的dll是调试版本(也就是说,它们是为调试而编译的),并且它们当前的.pdb文件位于同一目录中,那么您应该能够像在您自己的项目中一样逐步遍历它们。

另一种选择是打开构建这些dll的解决方案,并通过附加到您正在运行的程序的进程来调试它。https://msdn.microsoft.com/en-us/library/3s68z0b3.aspx

我最终解决了这个问题。我的方法是在解决方案中创建一个小型控制台应用程序,它运行与主应用程序相同的方法,但直接从解决方案中的项目中加载dll,而不是动态加载dll。

然后我将启动项目设置为控制台应用程序,并且能够正确地遍历相关文件。