我遇到了一个奇怪的问题,我可以解决,但不明白它为什么会发生。
我已经构建了一个启用了COM的DLL。在这个DLL中,我有使用函数CInt,CDec和IsNumeric的类。如果我从.NET应用程序测试这些类,那么它可以正常工作。但是当我从Win32应用程序(使用COM)调用/运行这些类时,我确实得到了“E_UNEXPECTED(0x8000FFFF)”错误。
经过一些调试后,我发现问题会因为我: - 用Integer.TryParse或Decimal.TryParse替换IsNumeric - 用Integer.Parse替换了CInt - 用Decimal.Parse替换了CDec
任何人都能解释一下吗?再一次,我可以通过这样做解决它,但我想知道原因。
答案 0 :(得分:1)
只是一个猜测。
我认为这在某种程度上与CInt
,CDec
等所有遗留函数在Microsoft.VisualBasic.dll
程序集中定义的事实有关,这似乎与COM不兼容
答案 1 :(得分:1)
这很奇怪。听起来像非托管代码传递的参数导致VB.NET代码中的异常。您的非托管代码无法检测托管异常。它应该在Output窗口的调试输出中可见,您应该看到异常代码为0xe0434f4e的第一次机会异常。
您的更改不是CInt / CDec的真正替代品,它们只会处理字符串参数。但更奇怪的是CInt()没有字符串问题,它不应该抛出。
虽然你正在使用参数类型进行快速和宽松的处理,但将字符串视为数字总是很麻烦。确保声明参数类型。将Option Strict放在源代码的顶部是一个操作二乘四的好方法。