错误HRESULT E_FAIL已从调用COM组件返回

时间:2010-11-17 23:50:20

标签: visual-studio silverlight silverlight-4.0

在Silverlight 4 app中;这个错误意味着什么?:

  

“错误HRESULT E_FAIL已从调用COM组件返回。”

这是一个非常普遍的错误。调试时,VS调试器不指向错误的确切位置。

25 个答案:

答案 0 :(得分:19)

这是一个古老的问题,但我想我会给出答案,因为我通过谷歌搜索找到了这个问题,因为完全相同的问题。

在我的情况下,我从Web上复制了一些示例XAML以开始使用Silverlight Toolkit 4.该示例XAML包含一个带有click事件处理程序的简单按钮,该处理程序与我实际存在的任何处理程序无关。代码背后。我一开始没有注意到这个简单的问题,因为编译器没有给我一个错误消息,我刚刚在运行时看到了“从一个COM组件的调用返回了错误HRESULT E_FAIL”消息。只有当我通过将样本XAML复制到一个全新的Silverlight应用程序而没有任何其他内容时,才能在编译时显示真正的底层问题。

因此,如果您在运行时遇到相同的错误消息,我的建议是仔细检查您的XAML是否存在您在编译时应该获取的任何错误,但由于某种原因最终导致错误上面提到的运行时错误为了进行调试,您可以执行我所做的操作,并在没有其他内容的独立Silverlight应用程序中隔离导致错误的代码,并查看是否像我一样,您会收到更有用的错误消息来指导您。

HTH。

答案 1 :(得分:7)

有很多解决方案,但这是唯一可以解决多次问题的解决方案。在VS2012 VS2013和VS2015上已经尝试过,我发现它对所有人都有效。只需按照以下步骤解决此问题< / p>

第1步:关闭Visual Studio
   第2步:删除 * .csproj.user * .soo 文件
   步骤3:重新打开VS,并尝试在调试模式下再次运行项目。

  

注意:当多个用户在上工作时会出现这种情况   项目不同的VS版本 .suo文件不受支持   用于两个VS版本之间的往返。它包含信息   关于当前用户为他/她的VS工作选择的设置   环境。

答案 2 :(得分:6)

在我的情况下:

我创建了一个

class MyControl : ContentControl {
}

默认情况下,该类不是公共的,XAML无法加载它并抛出异常

  

错误HRESULT E_FAIL已从调用COM组件返回

只需将类的范围更改为public,错误就会消失。

希望得到这个帮助。

PS。微软应该提供更多的信息,而不仅仅是抛出一个没有任何堆栈跟踪的神秘错误消息。

答案 3 :(得分:3)

我也遇到了这个错误,我发现这个问题与没有将所有必需的程序集添加到项目中有关。在我的情况下,我使用的UserControl与Silverlight Toolkit具有相关性,我没有添加此引用。 我刚刚添加了引用并解决了所有问题:)

答案 4 :(得分:2)

使用当前的SL4 Telerik控件时出现此错误。已经报道了一个类似的问题here,并提供了各种解决方案。问题似乎与Expression Blend管理控件缓存的方式有关。

答案 5 :(得分:2)

这是生成此错误的一种方法,我今天偶然发现了这个错误。我们在XAML中有以下按钮:

    <Button x:Name="button" Click="Button_Click" Content="Click me" />

处理按钮的Click事件的事件处理程序如下:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        button.Margin = new Thickness(0, double.NaN, 0, 0);
    }

当我点击按钮时,我收到上述错误。如果我将NaN替换为PositiveInfinityNegativeInfinity,则会出现同样的错误。

有趣的是,如果Thickness构造函数的第一个参数包含NaN而不是第二个参数,则会收到不同的错误消息。

答案 6 :(得分:2)

我从XAML的问题中得到了这个错误。奇怪的是我错过了StyleMargin属性使用的资源 - 这意味着应用程序运行正常,甚至resharper只报告'提示'。

一旦我解决了这些问题,我的“错误HRESULT E_FAIL已从调用COM组件返回。”消失了。正如其他人所说,这是一个模糊的错误,很难调试。在这种情况下,我继承了一个包含100个VS和ReSharper消息的大型项目,其严重程度各不相同 - StaticResource Style上的{{1}}属性不是我检查的第一个地方!

答案 7 :(得分:2)

我的xaml页面中出现此错误,并且没有语法错误。清理和重建项目解决了我的问题。 FYI ...

答案 8 :(得分:2)

IIS应用程序池必须作为具有Team Foundation Server查询权限的帐户运行。这解决了我的问题。

答案 9 :(得分:1)

此问题的大部分原因与组件设计相关的依赖性有关。 你只是在设计上面对这个问题。

Soulution很容易,但需要时间:)清理项目并重建所有。当你再次进入设计时,你应该看到一切都很好!

我希望这有帮助!

如果您最近看到此例外,请尝试重新安装silverlight sdk4。

答案 10 :(得分:1)

大多数时候很难看出问题的确切位置,特别是在XAML中。 另一种找出失败的方法是执行以下步骤

  1. 复制它在Visual Studio的输出窗口中显示的异常。例。 System.Reflection.TargetInvocationException
  2. 点击Debug - &gt;例外。它显示了例外列表。
  3. 点击&#34;添加..&#34;按钮。
  4. 在文本框中粘贴步骤1中复制的例外。选择&#34;公共语言运行时例外&#34;在下拉列表中。
  5. 点击&#34;确定&#34;按钮。将突出显示所选的例外。确保选中异常复选框。点击&#34;确定&#34;再次按下按钮关闭对话框。
  6. 现在以调试模式运行应用程序。发生异常时应用程序会中断。有时也在汇编模式下。
  7. 此时您有两个选择,

    • 单击显示的例外屏幕的查看详细信息。深入研究 内部异常,直到你从它的位置得到线索 始发。

    • 查看调用堆栈以查看您的行代码 这个例外。这将提供解决问题的线索。

答案 11 :(得分:1)

我最近在VS 2013中收到了Silverlight 5项目的这个错误。以上都不适合我。奇怪的是,这是一个线程问题(通常我习惯了一个例外,如果我试图在后台线程上错误地创建UIElements,则会解释这个问题)。

将包含Dispatcher.BeginInvoke的UIElements添加到MainPage的代码解决了这个问题:

 Dispatcher.BeginInvoke(() =>
 {
      // your code
 });

答案 12 :(得分:1)

对我而言,我将其缩小为我在很久以前从CodePlex下载的SplitButton控件。我已将解决方案从Silverlight 4升级到Silverlight 5,并因此错误而受到攻击。我能够通过将XAML注释到所有控件来缩小范围,然后逐个取消注释,直到错误再次出现:

System.Reflection.TargetInvocationException was unhandled by user code
  Message=Exception has been thrown by the target of an invocation.
  StackTrace:
       at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
       at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
       at System.Delegate.DynamicInvokeImpl(Object[] args)
       at System.Delegate.DynamicInvoke(Object[] args)
       at Homexaml_3.BindingOperation(Object BindingState, Int32 , Action )
  InnerException: 
       Message=Error HRESULT E_FAIL has been returned from a call to a COM component.
       StackTrace:
            at MS.Internal.XcpImports.CheckHResult(UInt32 hr)
            at MS.Internal.XcpImports.UIElement_Measure(UIElement element, Size availableSize)
            at System.Windows.UIElement.Measure(Size availableSize)

修复它的原因是手动删除过时的引用System.Windows.Control和System.Windows.Controls.Toolkit然后从Silverlight 5 SDK文件夹中重新添加它们。

希望它可以帮助某人(并帮助我!)如果它在未来几个月再次发生。

答案 13 :(得分:1)

好吧,我几乎要吃掉我的电脑.. 最后,我发现问题是我可能通过ACCIDENT在XAML页面中移除了Image对象的一个​​Margin设置的一个参数,orz ..

Margin="0,-20,0" 

应该是

Margin="0,-20,0,0" 

显然我没有意识到我曾修改过XAML的任何内容,所以我一直在为“一段时间”后面的代码进行故障排除..

幸运的是,我发现这篇文章并重新检查了所有内容,包括XAML页面......那是... ...... ...

答案 14 :(得分:1)

我的问题是缺少风格。我用自定义画笔覆盖了控件模板,如下所示:

<Style x:Key="MyCustomStyle" TargetType="Thumb">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Thumb">
                ....
                <TextBlock Foreground="{StaticResource MyCustomBrush}"

并且错过了我对MyCustomBrush的定义,如下所示:

<SolidColorBrush x:Key="MyCustomBrush" Color="#FFAC0909"/>

然后BOOM,应用程序没有启动,我收到了COM错误消息。

答案 15 :(得分:1)

对我来说,这是一个XAML解析错误。在数据模板中,我在两个标签之间有一个额外的 S (可能是因为我按 S 而不是 CTRL + S )。例如......

<DataTemplate>
   <Border/>s
</DataTemplate>

因此,我建议您在视图中查找格式不正确的XML,以便在显示时导致此异常。

答案 16 :(得分:1)

在查询Team Foundation Server时,尝试使用MICROSOFT.TEAMFOUNDATION库时,最终解决了这个问题:

  1. 必须使用应用程序中引用的当前版本安装Team Foundation Explorer。
  2. MSDTC - 配置。 (参见下面的DTC配置)
  3. IIS App Pool必须作为具有Team Foundation Server查询权限的帐户运行
  4. IIS应用程序池必须作为在IIS服务器上具有COM访问权限的帐户运行(我们为此设置了专用服务器,因此我们将身份用户设置为本地服务器上的管理员)。
  5. 必须关闭或配置防火墙才能允许COM访问DTC服务。
  6. DTC配置----

    1. 单击“开始”,单击“运行”,键入dcomcnfg,然后单击“确定”以打开“组件服务”。
    2. 在控制台树中,单击以展开“组件服务”,单击以展开“计算机”,单击以展开“我的电脑”,然后单击以展开“分布式事务处理协调器”。
    3. 右键单击“本地DTC”,然后单击“属性”以显示“本地DTC属性”对话框。
    4. 单击“安全”选项卡。
    5. 在“安全设置”部分中,单击“网络DTC访问”。
    6. 在“客户端和管理”部分中,选择“允许远程客户端和允许远程管理”。
    7. 在“事务管理器通信”部分中,选择“允许入站”和“允许出站”。
    8. 在“事务管理器通信”部分中,选择“需要相互身份验证”(如果所有远程计算机都运行Windows Server 2003 SP1或Windows XP SP2或更高版本),选择“需要传入呼叫者身份验证”(如果在群集中运行MSDTC),或选择“否”身份验证如果某些远程计算机位于Windows Server 2003 SP1之前或Windows XP SP2之前,则需要。建议的选择是不需要身份验证。
    9. 我希望这会有所帮助。

答案 17 :(得分:1)

我遇到了这个例外而且疯了。我建议你检查你最近是否安装了一个可能存在冲突的命名空间项的组件。在我的情况下,我安装了Windows手机工具套件,其中包含类似于Windows手机上的库存工具套件命名的项目。 Asap我从Nuget包管理器中卸载了这个,一切都恢复正常了。

答案 18 :(得分:1)

我在编写实时视频和音频(使用 Microsoft Expression )时遇到了这个问题,下一段代码突然抛出异常

// Set bitrate
liveJob.OutputFormat.VideoProfile.Bitrate = new ConstantBitrate(2500);

// Set Video size
liveJob.OutputFormat.VideoProfile.Size = new Size(320,240); 

直到我发现第二行抛出异常,而第一行仍然在另一个线程中运行!

当然,这是我的错 - 我在代码中调用了该方法,并且它也被Click事件调用...

答案 19 :(得分:1)

这是一个安全和权限问题。查看IIS并确保集成安全性已打开。然后将Application Protection level设置为Medium(如果它为高,则可能是结果)。然后检查您的Web.Config文件。确保模仿已关闭。

这应该有所帮助。

答案 20 :(得分:0)

这个错误似乎是一个“无所不能”的错误。对于没有给出特定定义或跟踪的错误,特别是那些与相对外部Xaml代码有关的错误。

在我的特定情况下,名称空间似乎存在问题。我的UserControl在它自己的命名空间中(创造性地命名为&#34; UserControls&#34;)。我的页面位于他们自己的命名空间中(&#34; Pages&#34;)。我想在UserControl中引用Pages命名空间中的枚举定义,所以我只是添加了一个using语句:using MySolution.Pages;。很琐碎,我不想相信这就是问题所在。但是当我删除那个using语句并简单地在我的UserControls名称空间中创建枚举时,没有更多的HRESULT错误,并且作为额外的奖励,我在UserControl中定义了依赖属性,否则神秘地没有出现在Xaml intellisense中,突然在那里准备使用。

我怀疑在我的情况下,这种情况的根本原因是某种循环引用问题。由于没有更具体的错误可以将这些信息与我联系起来,因此它只是被拖入这个HRESULT E_FAIL Com错误。

答案 21 :(得分:0)

我通过删除XAML文件并添加新项目来添加新文件来修复此错误。然后我粘贴了旧文件中的XAML代码。

答案 22 :(得分:0)

就我而言,当我尝试将数据库导入SSDT项目时,但是这个数据库已经在项目中,但是是空的。我刚用Tools -> SQL server -> New schema comparsion更新了我的项目。来源 - 数据库,目标 - 项目。比较 - 更新。

希望对某人有帮助

答案 23 :(得分:0)

这是一个古老的问题,但就我而言,上述解决方案均无效。 我试图在Visual Studio 2017中更新NuGet程序包,但出现以下异常。

update-package : Failed to add reference to 'System.Web.Razor'.
  Error HRESULT E_FAIL has been returned from a call to a COM component.

实际上,其他NuGet命令(如restore-package)均失败,并显示类似的异常消息。

我发现packages目录下缺少一些程序集,所以我删除了packages目录,然后返回到Visual Studio2017。打开解决方案时,它要求我还原程序包,然后还原。这样我就可以更新软件包了。

  

注意:在删除 package 目录之前,请先对其进行备份。

答案 24 :(得分:0)

在安装VS2019并尝试打开针对VS2015的vcxproj和csproj项目的大型解决方案(20个以上的项目)后,我遇到了相同的错误。 csproj全部加载正常,而vcxproj全部失败,并显示OP错误。删除.vs文件夹无效。

所做的工作是在“浏览数据库后备”设置下设置VC ++的“后备位置”。

Tools (menu)
-Options...
--Text Editor
---C/C++
---Advanced
----Browsing Database Fallback
-----Fallback Location

我将我的设置为D:\VC++\v16。我将v140用于VS2015并将v141用于VS2017的地方。还要设置“始终使用”和“不警告”。