"MyLibrary.dll模块的符号未加载"

23
我正在学习制作一个关于Pokemon信息的基本应用程序,以此来学习Windows Phone开发。为此,我创建了一个可移植类库(PokeLib.dll),使其与通用应用兼容。我通过同一解决方案中的一个项目(“Test”)进行了测试,一切正常。你可以在我的Github上查看这些代码,但据我所知,它们都很好。这两个项目在同一个解决方案中。对于Windows Phone应用程序的解决方案,我将PokeLib添加为“现有项目”,添加了引用,并编写了几行代码以确保可以成功调用它: MainPage.xaml:
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <Button Name="GetDataButton" Content="GetData" Click="GetDataButton_Click" Grid.Row="0" HorizontalAlignment="Center"/>
    <TextBlock Name="DataText" Text="Click to get data" Grid.Row="1" Padding="10"/>
</Grid>

MainPage.xaml.cs:

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        p = new Pokemon(1); // gets data for Pokemon #1 (Bulbasaur)
    }

    Pokemon p;
    int counter = 0;

    private async void GetDataButton_Click(object sender, RoutedEventArgs e)
    {
        DataText.Text = "Fetching... Count: " + ++counter;
        if (counter == 1) // first time button's clicked
        {
            await p.Create(); // populates the data container
            DataText.Text = String.Format("Pokemon #{0}: {1}", p.Id, p.Name);
        }
    }

当我尝试在手机模拟器上运行此项目时,出现以下消息:。我以 "debug" 模式构建项目,并取消了 "启用我的代码" 选项。我不确定在 Symbols 面板下该怎么做,但如果有用的话,我也可以添加屏幕截图。

无论如何,应用程序会打开,在我按下 GetData 按钮时会冻结。我预计由于该调用是同步完成的,它会冻结一会儿,但这是永久性的。然而,没有错误/异常被抛出。当我尝试步入 p.Create() 调用时,调试器也没有响应(可能源于屏幕截图中的消息)。

有人知道我做错了什么吗?谢谢!


可能存在死锁问题。您应该等待调用 p.Create 而不是调用 Wait 方法。在 UI 线程上等待本来就是不好的做法。 - Kevin Gosse
@KooKiz 我知道,我只是想让一些概念验证的东西工作起来。我已经更新了帖子,加入了最新的代码。虽然现在GetDataButton_Click方法是异步的,但在按下按钮后程序仍会挂起,这本来不应该发生。 - Benjin
1
我意识到这个问题有点老了,但是清理解决方案并重新启动 VS 对我来说解决了这个错误。 - Brandon Ward
15个回答

16
你可以前往项目属性 -> 构建 -> 高级按钮 -> 调试信息下拉菜单,并将其值更改为“full”。

这并没有提供问题的答案。如果要批评或请求作者进行澄清,请在其文章下方留下评论-您始终可以对自己的文章发表评论,一旦您拥有足够的声望,您就可以在任何帖子上发表评论 - David says Reinstate Monica
8
我不想批评或向作者请求澄清。我只是提供了一种帮助我删除此消息的解决方案。 - Ivan
1
谢谢,但这并没有帮到我。我有一个Silverlight项目和一个包含可移植类库的公共项目。可移植类库被用于Silverlight客户端和另一个类库之间的共享。 - AH.
它对我起作用了。这是我将来遇到类似情况时的提醒。 :) 此外,调试也很有效。 - Dragos Durlut
对我来说没有任何改变,能够解释一下为什么这样会起作用会更好。 - Josh
显示剩余2条评论

9
在Visual Studio中,我选择了“生成”->“清理解决方案”。这样就摆脱了这个消息。

5

我刚刚解决了相同的错误。我进入 Visual Studio 2013 的“工具”->“选项”->“调试”->“符号”,然后点击“清空符号缓存”。也许直接删除 bin 和 obj 文件夹可以达到相同的效果,但这种方式不够优雅。


对我有用。谢谢。 - Alessandro Lallo

4

在我拥有一个存储在GAC中的程序集且Visual Studio在编译/调试前没有将其删除时,我遇到了这个错误。通过从GAC中移除该库(dll),我成功解决了这个问题。

//if pokelib.dll contained assembly: PokeLibrary.Pokemon 
//and it showed up in the GAC (c:\windows\assembly\) with that assembly name
gacutil /u PokeLibrary.Pokemon

这样做解决了警告条件,让我再次进行调试。

我遇到了同样的问题,但为什么它要使用GAC,有没有其他方法可以解决,而不是从GAC中删除它们? - Adeem
是的。如果您的源代码与GAC中的版本匹配,您可以使用exe运行/加载dll(从GAC而不是从您的项目),然后您可以使用Visual Studio的“附加到进程”(菜单,工具,附加到进程)进行调试。但是,如果您对代码进行任何更改,则必须无/重新安装dll。 - tgolisch
在从GAC中删除.dll文件后,我还需要执行一次项目的清理和构建操作。 - Dowlers

2

您正在使用一个未编译为调试模式的引用dll来调试代码。

将引用的dll编译为调试模式并使用它。

检查引用的dll地址以确保您正在使用正确的dll。


1
我逐个构建了每个可能导致问题的项目,然后消息消失了。 - Rich

1
唯一的解决方法是进入“调试”>“选项和设置”>“调试”>“符号”,然后选择名为“所有模块(除非排除)”的单选按钮,这样才能避免此错误信息。
我不确定这是否是最佳解决方法,但现在它可以工作了。

1

请确保您没有打开多个Visual Studio窗口,特别是同一项目的窗口! :)


1
在我的情况下,我有另一个版本的应用程序正在运行,它使用相同的.dll文件。这阻止了GAC更新为调试版本。我必须通过任务管理器结束该进程。

0

这是我是如何解决的,

我在两个浏览器中同时打开了同一个页面,一开始我选择了第一个浏览器,然后在不关闭第一个浏览器的情况下选择了第二个浏览器进行调试,关闭其中一个浏览器后问题就解决了...


0
您可以使用 DotPeek 生成库的 PDB 文件,然后将其放置在与您的 DLL 相同的文件夹中。另外一个选项是,如果代码是开源的,可以克隆仓库,将项目添加到您的项目中,添加依赖项,设置构建顺序并开始调试。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接