You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET8升级至.NET10后WPF应用发布运行缺失WindowsFormsIntegration程序集问题

.NET 10 WPF发布后缺失WindowsFormsIntegration程序集的替代解决方案

将WPF应用从.NET 8升级到.NET 10后,本地运行正常,但发布到其他电脑运行时抛出未处理的调度程序异常,核心错误为找不到WindowsFormsIntegration程序集。当前通过在启动项目中设置<UseWindowsForms>True</UseWindowsForms>可以解决,但希望找到其他替代方案。

异常详情

System.Windows.Markup.XamlParseException: Die Angabe eines Werts für \"System.Windows.Baml2006.TypeConverterMarkupExtension\" führte zu einer Ausnahme.
 ---&gt; System.IO.FileNotFoundException: Could not load file or assembly 'WindowsFormsIntegration, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. Das System kann die angegebene Datei nicht finden.
File name: 'WindowsFormsIntegration, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
    at System.Reflection.RuntimeAssembly.InternalLoad(AssemblyName assemblyName, StackCrawlMark&amp; stackMark, AssemblyLoadContext assemblyLoadContext, RuntimeAssembly requestingAssembly, Boolean throwOnFileNotFound)
    at System.Reflection.Assembly.Load(AssemblyName assemblyRef)
    at System.Windows.Baml2006.Baml2006SchemaContext.ResolveAssembly(BamlAssembly bamlAssembly)
    at System.Windows.Baml2006.Baml2006SchemaContext.GetAssembly(Int16 assemblyId)
    at System.Windows.Baml2006.Baml2006SchemaContext.EnsureXmlnsAssembliesLoaded(String xamlNamespace)
    at System.Windows.Baml2006.Baml2006SchemaContext.GetXamlType(String xamlNamespace, String name, XamlType[] typeArguments)
    at MS.Internal.Xaml.XamlContext.GetXamlType(XamlTypeName typeName, Boolean returnUnknownTypesOnFailure, Boolean skipVisibilityCheck)
    at MS.Internal.Xaml.XamlContext.ResolveXamlType(String qName, Boolean skipVisibilityCheck)
    at MS.Internal.Xaml.Context.ObjectWriterContext.ServiceProvider_Resolve(String qName)
    at System.Windows.PropertyPath.ResolvePropertyName(String name, Object item, Type ownerType, Object context, Boolean throwOnError)
    at System.Windows.PropertyPath.ResolvePathParts(ITypeDescriptorContext typeDescriptorContext)
    at System.Windows.PropertyPath..ctor(String path, ITypeDescriptorContext typeDescriptorContext)
    at System.Windows.PropertyPathConverter.ConvertFrom(ITypeDescriptorContext typeDescriptorContext, CultureInfo cultureInfo, Object source)
    at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CallProvideValue(MarkupExtension me, IServiceProvider serviceProvider)
    --- End of inner exception stack trace ---
    at System.Windows.Markup.XamlReader.RewrapException(Exception e, IXamlLineInfo lineInfo, Uri baseUri)
    at System.Windows.Markup.XamlReader.RewrapException(Exception e, Uri baseUri)
    at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader, XamlObjectWriter currentWriter)
    at System.Windows.FrameworkTemplate.LoadOptimizedTemplateContent(DependencyObject container, IComponentConnector componentConnector, IStyleConnector styleConnector, List`1 affectedChildren, UncommonField`1 templatedNonFeChildrenField)
    at System.Windows.FrameworkTemplate.LoadContent(DependencyObject container, List`1 affectedChildren)
    at System.Windows.StyleHelper.ApplyTemplateContent(UncommonField`1 dataField, DependencyObject container, FrameworkElementFactory templateRoot, Int32 lastChildIndex, HybridDictionary childIndexFromChildID, FrameworkTemplate frameworkTemplate)
    at System.Windows.FrameworkTemplate.ApplyTemplateContent(UncommonField`1 templateDataField, FrameworkElement container)
    at System.Windows.FrameworkElement.ApplyTemplate()
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at System.Windows.Controls.StackPanel.StackMeasureHelper(IStackMeasure measureElement, IStackMeasureScrollData scrollData, Size constraint)
    at System.Windows.Controls.StackPanel.MeasureOverride(Size constraint)
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at System.Windows.Controls.Border.MeasureOverride(Size constraint)
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at System.Windows.Controls.Control.MeasureOverride(Size constraint)
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at System.Windows.Controls.Border.MeasureOverride(Size constraint)
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at System.Windows.Controls.Control.MeasureOverride(Size constraint)
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at System.Windows.Controls.Control.MeasureOverride(Size constraint)
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at System.Windows.Controls.Grid.MeasureCell(Int32 cell, Boolean forceInfinityV)
    at System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV, Boolean&amp; hasDesiredSizeUChanged)
    at System.Windows.Controls.Grid.MeasureOverride(Size constraint)
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at System.Windows.Controls.Grid.MeasureCell(Int32 cell, Boolean forceInfinityV)
    at System.Windows.Controls.Grid.MeasureCellsGroup(Int32 cellsHead, Size referenceSize, Boolean ignoreDesiredSizeU, Boolean forceInfinityV, Boolean&amp; hasDesiredSizeUChanged)
    at System.Windows.Controls.Grid.MeasureOverride(Size constraint)
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at MS.Internal.Helper.MeasureElementWithSingleChild(UIElement element, Size constraint)
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at System.Windows.Controls.Decorator.MeasureOverride(Size constraint)
    at System.Windows.Documents.AdornerDecorator.MeasureOverride(Size constraint)
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at System.Windows.Controls.Border.MeasureOverride(Size constraint)
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at System.Windows.Window.MeasureOverrideHelper(Size constraint)
    at System.Windows.Window.MeasureOverride(Size availableSize)
    at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
    at System.Windows.UIElement.Measure(Size availableSize)
    at System.Windows.Interop.HwndSource.SetLayoutSize()
    at System.Windows.Interop.HwndSource.set_RootVisualInternal(Visual value)
    at System.Windows.Window.SetRootVisualAndUpdateSTC()
    at System.Windows.Window.SetupInitialState(Double requestedTop, Double requestedLeft, Double requestedWidth, Double requestedHeight)
    at System.Windows.Window.CreateSourceWindow(Boolean duringShow)
    at System.Windows.Window.ShowHelper(Object booleanBox)
    at System.Windows.Window.Show()
    at Prism.PrismApplicationBase.OnInitialized()
    at Prism.PrismApplicationBase.InitializeInternal()
    at Prism.PrismApplicationBase.OnStartup(StartupEventArgs e)
    at MyProject.App.OnStartup(StartupEventArgs e)
    at System.Windows.Application.&lt;.ctor&gt;b__1_0(Object unused)
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

替代解决方案

1. 直接引用WindowsFormsIntegration NuGet包

在启动项目中添加对WindowsFormsIntegration NuGet包的引用,发布时会自动包含该程序集,无需启用整个Windows Forms框架。

  • 操作:在项目的NuGet包管理器中搜索WindowsFormsIntegration并安装,或在项目文件中添加以下代码:
<PackageReference Include="WindowsFormsIntegration" Version="8.0.0" />

(版本号可根据.NET 10兼容的最新版本调整)

2. 手动包含程序集到发布输出

若不想使用NuGet包,可手动复制程序集到发布目录:

  • 从本地.NET安装目录找到WindowsFormsIntegration.dll(通常路径为C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\10.0.x.x\WindowsFormsIntegration.dll)
  • 将该文件添加到项目中,设置“复制到输出目录”属性为“始终复制”或“如果较新则复制”
  • 发布时文件会被包含到输出文件夹中

3. 移除不必要的WPF-WinForms集成引用

异常提示XAML解析时触发了对WindowsFormsIntegration的依赖,可能是项目中存在未使用的WinForms相关代码:

  • 检查所有XAML文件,移除未使用的xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"命名空间或WindowsFormsHost控件
  • 清理项目中未使用的WinForms相关代码、资源,避免编译时引入不必要的程序集依赖

4. 调整发布裁剪设置(若启用裁剪)

如果发布时启用了程序集裁剪,可能导致WindowsFormsIntegration被误裁剪,需在项目文件中添加配置保留该程序集:

<ItemGroup>
  <TrimmerRootAssembly Include="WindowsFormsIntegration" />
</ItemGroup>

内容的提问来源于stack exchange,提问作者manteltraeger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 21:45:54