0xC0020001:字符串绑定无效。 - 仅发生在 WPF 中

Posted

技术标签:

【中文标题】0xC0020001:字符串绑定无效。 - 仅发生在 WPF 中【英文标题】:0xC0020001: The string binding is invalid. - Only occurring in WPF 【发布时间】:2012-08-06 20:51:46 【问题描述】:

首先,我可能应该说我可能在 5 年级的水平上使用这些东西...我在 WPF 应用程序中使用 C++ 插件。每当我尝试退出程序时,都会收到此错误:

Raptor.exe 中 0x770d15de 处未处理的异常:0xC0020001:字符串绑定无效。

我一直在使用这个blog entry 来尝试解决问题,但我没有运气。不过我注意到的一件事是,当我在控制台应用程序中使用相同的 C++ 插件,调用 WPF 应用程序中使用的许多相同方法时,控制台会毫无问题地退出。

我也浏览了 C++ 代码,但找不到在任何地方声明的单个静态变量。虽然有静态方法。

任何帮助将不胜感激!

编辑:我启用了一些调试功能来查看它在哪里中断。它破坏了以下最后一个括号中的 sp_counted_impl.hpp 文件(Boost):

    virtual void dispose() // nothrow
    
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
        boost::sp_scalar_destructor_hook( px_, sizeof(X), this );
#endif
        boost::checked_delete( px_ );
    

【问题讨论】:

C++ 代码是完全原生的(例如,通过 COM 或 P/Invoke 公开)、带有托管扩展的 C++(即 VS2003)还是 C++/CLI(VS2005 及更高版本)? C# 代码如何加载 C++ 插件?听起来您拥有所有 C++ 源代码并且可以进行任何必要的修改(它不是您使用的第三方组件);对吗? 正确,但代码 99% 是由第三方编写的。我只是按下按钮......它在VS2008中。我已经使用了一些 \clr 东西,它链接了一堆代码(不知道那是做什么的),我把它作为一个多线程 DLL。编译后,它会导出一个 DLL,然后我将其作为引用添加到我的 C# 项目中 好的,这听起来和我遇到的问题一样(并且在博客中提到过); IIRC 我只能通过在 C++ 方法中使用 static 变量(而不是使用全局变量)来重现它,所以如果你没有找到任何 static 变量,我不确定是什么原因造成的。您可能需要启用非托管代码调试(项目属性,调试选项卡),在 Debug > Exceptions 中启用 Break when Thrown 并查看在 crtdll.c 中调试异常是否提供任何线索... 另一种可能性:这个项目是否有一个DllMain 函数可以做任何不平凡的事情?在DllMain 内几乎没有什么可以做的,不会遇到问题(请参阅此处的链接以获取示例/讨论:***.com/q/5834508)。如果您的 C++ DLL 中有复杂的未初始化代码,则可能会导致此问题。 要查找 atexit,您可以启用非托管代码调试并在 _onexit_nolock 中放置断点(VS2008 中的 C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\crt\src\onexit.c) .或者,在 crtdll.c(同一文件夹)的第 444 行放置一个断点,并在function_to_call 中添加一个监视。继续调试会话,直到它抛出异常。最后一个function_to_call 可能是罪魁祸首;希望它的名字能为在 C++ 代码中搜索提供线索。 【参考方案1】:

这发生在某些不与本机库链接的 DLL 中,因此它们的 DllMain 不会初始化某些需要的本机子系统(如 CRT 或 ATL)。听起来您有某种混合模式的 DLL。一种推荐的解决方案是从托管 DLL 中删除入口点: 删除托管 DLL 的入口点

    与 /NOENTRY 链接。在解决方案资源管理器中,右键单击项目 节点,单击属性。在“属性页”对话框中,单击 链接器,单击命令行,然后将此开关添加到 其他选项字段。 链接 msvcrt.lib。在属性页对话框中,单击链接器, 单击 Input.,然后将 msvcrt.lib 添加到 Additional Dependencies 财产。 删除 nochkclr.obj。在 Input 页面(与上一步相同的页面)上,从 Additional Dependencies 属性中删除 nochkclr.obj。 CRT 中的链接。在 Input 页面(与上一步相同的页面)上,将 __DllMainCRTStartup@12 添加到 Force Symbol References 属性。

更多细节可以在这里找到:https://support.microsoft.com/en-us/kb/814472

【讨论】:

非常感谢 - 我现在正在尝试。我确实注意到 nochkclr.obj 已经不存在了...... 微软支持链接失效:(。请更新! 很遗憾,得到了LNK2001: unresolved external symbol __DllMainCRTStartup@12 @PatrizioBertoni:我遇到了同样的问题,发现了这个 [链接](social.msdn.microsoft.com/Forums/en-US/…)。它基本上说:在 64 位编译中,导出的函数没有修饰。使用 _DllMainCRTStartup(一个下划线,没有“@12”后缀)

以上是关于0xC0020001:字符串绑定无效。 - 仅发生在 WPF 中的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 / PrimeNG - 表达式在检查后发生了变化。在最后一个无效的表单控件上绑定 NgModel

如何调试仅在提交到应用商店后发生的“无效捆绑包”错误

python:UnicodeDecodeError:'utf8'编解码器无法解码位置0的字节0xc0:无效的起始字节

使用代码0xC0000417(无效的C运行时参数)退出意外的程序

0xC0000005: 写入位置 0x00000000 时发生访问冲突的解决办法(转)

UTF-8字符集在Windows Hotspot JVM 1.8.0_201中输出无效编码