2

当我启动我的 WPF 应用程序并转到InitializeComponent一个用户控件的函数调用时,它会静默退出,并且只在输出窗口中留下一条消息,说 Managed (v4.0.30319)' has exited with code -1073740771( 0xc000041d)。当我说“静默”时,我的意思是即使我用-块包装这个InitializeComponent调用也没有捕获到异常(这就是我通常发现问题所在的方式)trycatch

这是我所做的:在这个应用程序项目中,我们需要使用参考 Microsoft.Office.Interop.Owc.dll,版本号为 10.0.4504.0。由于它是一个互操作库,所以当我在 VS2012 中添加此引用时,它会自动将该属性设置Embedded Interop Types为 true,我认为这意味着它不会在输出文件夹中保留单个 dll,而是将此库嵌入到主输出中(至少这就是我们在其他参考资料中的表现,例如 Microsoft.Office.Interop.Outlook.dll)。然而,当我启动这个项目时,它抛出了一个XamlParseException说法:

“无法加载文件或程序集 'Microsoft.Office.Interop.Owc, Version=10.0.4504.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 或其依赖项之一。系统找不到指定的文件。”:“Microsoft.Office .Interop.Owc,版本=10.0.4504.0,文化=中性,PublicKeyToken=31bf3856ad364e35""

好像没有嵌入引用(或者版本不正确。但我验证了引用版本确实是10.0.4504.0)

接下来我将这个 dll 直接复制到输出文件夹bin\Debug\,以确保它可以找到这个库。这次没有抛出异常,但整个应用程序就像我在开始时描述的那样默默地退出。我试图用谷歌搜索代码-10737407710xc000041d),但没有关于它的文章。我试图将其设置Embedded Interop Types为真/假,但问题是一样的。

更新:

我想在这里添加更多描述。如上所述,有问题的库是 OWC(Office Web Component)10。我按照此链接使 OWC 与 VB.NET 桌面应用程序一起工作:如何:在 Visual Studio .NET 中处理 Office Web 组件的事件。但是这篇官方文章太老了,所以我不得不做很多修改来编译包装器 dll(主要是因为命名空间不匹配)。然后,当我添加对实际互操作库 Microsoft.Office.Interop.Owc 的引用时,如果我遵循默认设置并让 Embedded Interop Types 为 True,在运行时它会抱怨(抛出XamlParseException) 无法加载程序集(参见上面的描述)。我勒个去?我认为将其设为“嵌入式”可以保证找到该库。然后我将此 dll 复制到输出文件夹,然后我有这个静默退出问题。但可能值得一提的是,这次输出窗口显示Microsoft.Office.Interop.Owc.dll确实已加载。实际上它是消息之前的最后一条managed has exited消息。所以它必须仍然与这个库有关。

所有这一切都只发生在 OWC10 上。实际上,在 OWC11 中也有类似的方法(最新的,但不幸的是,它仍然是 Office2003 附带的旧版本):如何:在 Visual Studio .NET 中处理 Office 2003 Web 组件的事件。但它确实有效,并且控件显示在我的应用程序上。由于其他一些原因,我想尝试 OWC10 而不是 OWC11

4

2 回答 2

1

当我启动我的 WPF 应用程序并转到一个用户 > 控件的 InitializeComponent 函数调用时,它会静默退出,并且只在输出窗口中留下一条消息,说 Managed (v4.0.30319)' has exited with code -1073740771 (0xc000041d)。当我说“静默”时,我的意思是>即使我用 try-catch 块包装这个 InitializeComponent 调用,也没有捕获到异常(这就是>我通常如何找到问题所在)

接下来我将这个 dll 直接复制到输出文件夹 bin\Debug\,以确保它可以找到这个 >library。这次没有抛出异常,但整个应用程序只是默默地退出,正如我在开始时所描述的那样。我试图用谷歌搜索代码-1073740771(0xc000041d),但没有>关于它的文章。我尝试将 Embedded Interop Types 设置为 true/false,但问题是 > 相同。

我今天发生了完全相同的事情,“以代码 -1073740771 (0xc000041d) 退出。” (这发生在我的 VB 和 C# .NET WinForms 应用程序中)。我尝试调试,发现我什至从未进入 Form_Load 代码块。

我最终通过以管理员身份运行visual studio“解决”了这个问题(然后通过菜单打开并构建和运行项目)。这是一个 win8 安全问题,在任何地方都没有得到很好的解释。(我分心了,直接从我的任务栏/解决方案文件中打开了一个特定的项目,导致这种情况发生在我身上)。

您现在可能已经自己发现了这一点,希望您没有为此失去任何头发:) 只是为其他可能在某处发生此错误的人指出这一点。

于 2014-10-28T19:03:20.513 回答
0

也有这个问题,在 x64 平台上使用代码 -1073740771 (0xc000041d) 的“静默”退出,在 x86 平台上一切正常。

我的应用程序的一部分是非托管 C++,另一部分是 C#。事实证明,我的 C++ 代码还没有完全准备好用于 x64 平台。以下更改解决了我的问题:

// before
g_OrigWndProc = reinterpret_cast<WNDPROC>(::SetWindowLongPtr(hWnd, GWLP_WNDPROC,
                reinterpret_cast<LONG>(WindowProc)));

// fixed version
g_OrigWndProc = reinterpret_cast<WNDPROC>(::SetWindowLongPtr(hWnd, GWLP_WNDPROC,
                reinterpret_cast<LONG_PTR>(WindowProc)));

因此,一般建议是验证您的代码是否已完全准备好用于 x64 平台。

于 2015-04-09T20:59:47.537 回答