无法在 C# 项目中加载 dll 的符号
Unable to load symbols for dll in c# project
我有一个主应用程序,它从编译的 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 代码中放置断点时,我收到消息说无法加载符号。我已经尝试检查 Debug>Windows>Modules,但是由于没有直接加载到应用程序中,dll 没有显示在那里。
如果有问题的 dll 是调试版本(也就是说,它们是为调试而编译的)并且它们当前的 .pdb 文件位于同一目录中,您应该能够像它们在您的目录中一样单步执行它们自己的项目。
另一种选择是打开构建这些 dll 的解决方案,并通过 附加 到您正在 运行 的程序的进程来调试它。
所以我最终解决了这个问题。我这样做的方法是在解决方案中创建一个小型控制台应用程序,它运行与主应用程序相同的方法,但直接从解决方案中的项目运行,而不是动态加载 dll。
然后我将启动项目设置为控制台应用程序,并且能够正确地单步执行相关文件。
我有一个主应用程序,它从编译的 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 代码中放置断点时,我收到消息说无法加载符号。我已经尝试检查 Debug>Windows>Modules,但是由于没有直接加载到应用程序中,dll 没有显示在那里。
如果有问题的 dll 是调试版本(也就是说,它们是为调试而编译的)并且它们当前的 .pdb 文件位于同一目录中,您应该能够像它们在您的目录中一样单步执行它们自己的项目。
另一种选择是打开构建这些 dll 的解决方案,并通过 附加 到您正在 运行 的程序的进程来调试它。
所以我最终解决了这个问题。我这样做的方法是在解决方案中创建一个小型控制台应用程序,它运行与主应用程序相同的方法,但直接从解决方案中的项目运行,而不是动态加载 dll。
然后我将启动项目设置为控制台应用程序,并且能够正确地单步执行相关文件。