1

根据 MSDN,看起来我刚刚撞到的墙是坚固的:

http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly.aspx

从非托管应用程序加载托管程序集时,GetEntryAssembly 方法可以返回 null。例如,如果非托管应用程序创建用 C# 编写的 COM 组件的实例,则从 C# 组件调用 GetEntryAssembly 方法将返回 null,因为进程的入口点是非托管代码而不是托管程序集。

在我决定开始使用ResourceDictionaryandMergedDictionaries之前,我有很多很多冗余的 XAML。我删除了 all <controls:MyCustomControl.Resources>,只留下了这个:

<controls:GlossyContentControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack:application:,,,,/MyApp.Namespace;component/Themes/generic.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</controls:GlossyContentControl.Resources>

我可以构建项目,但是当我为使用我的任何光泽内容控件的窗口打开设计器时,我得到一个 IOException,“无法创建”MyShinyNewControl”的实例。单击此处隐藏详细信息,然后在错误中列出它还说Cannot create an instance of "MyShinyNewControl",尽管解决方案已构建(但当我通过 COM 运行它时会出现相同的 IOException )。

该项目是一个类库,是包含一堆类库的解决方案的表示层,主要的类库公开了一个由一些 VB6 代码实例化的对象。在我介绍共享资源/样式的概念之前,它就像一个魅力,但我到处都有大量冗余的 XAML。

是否有解决方法使其通过 COM 工作,或者解决方法是在任何地方复制所有样式?


设计器中异常的堆栈跟踪:

找不到资源“themes/generic.xaml”。在 MS.Internal.AppModel.ResourcePart.GetStreamCore(FileMode 模式,FileAccess 访问 System.IO.Packaging.PackagePart.GetStream(FileMode 模式,FileAccess 访问)在 System.IO.Packaging.PackWebResponse.CachedResponse.GetResponseStream() 在 System。 IO.Packaging.PackWebResponse.GetResponseStream() 在 System.IO.Packaging.PackWebResponse.get_ContentType() 在 MS.Internal.WpfWebRequestHelper.GetContentType(WebResponse response) 在 MS.Internal.WpfWebRequestHelper.GetResponseStream(WebRequest request, ContentType& contentType) 在系统.Windows.ResourceDictionary.set_Source(Uri value) at System.Windows.Baml2006.WpfSharedBamlSchemaContext.b__1c4(Object target, Object value) at System.Windows.Baml2006.WpfKnownMemberInvoker.SetValue(Object instance,

在运行时,XamlParseException 的堆栈跟踪(从法语翻译的异常):

类型引用找不到名为“{clr-namespace:MyApp.Common.Controls}GlossyContentControl”的类型。在 MS.Internal.Xaml.Context.ObjectWriterContext.ServiceProvider_Resolve(String qName) 在 MS.Internal.Xaml.ServiceProviderContext.System.Windows.Markup.IXamlTypeResolver.Resolve(String qName) 在 System.Xaml.Replacements.TypeTypeConverter.ConvertFrom(ITypeDescriptorContext上下文,CultureInfo 文化,对象值)在 MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateObjectWithTypeConverter(ServiceProviderContext serviceContext,XamlValueConverter 1 ts, Object value) at MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateFromValue(ServiceProviderContext serviceContext, XamlValueConverter1 ts,对象值,XamlMember 属性)在 System.Xaml.XamlObjectWriter.Logic_CreateFromValue(ObjectWriterContext ctx,XamlValueConverter`1 typeConverter , 对象值, XamlMember 属性, String targetName, IAddLineInfo lineInfo)

奇怪的是,如果我为任何有光泽的内容控件打开设计器,就会应用样式并且一切看起来都应该如此。但是承载此类控件的窗口无法呈现它们。


以下是解决方案的概述:

  • VB6 ActiveX dll 实例化托管代码并运行用 C# 编写的功能
  • C# 功能获取数据、定义视图模型并实例化 WPF 窗口
  • 显示 WPF 窗口,一切正常

没有涉及 app.xaml,代码只是实例化Window对象并调用ShowDialog()它,它可以工作。

在引入共享资源的某个时刻,我似乎需要一个app.xaml,所以我做了一个,而不是Application Definition将其构建操作设置为Page。这样做允许使用 my ,我曾经用该自定义内容控件的实例GlossyContentControl替换一些对象。UserControl

由于我仍然没有入口点并且本身没有 WPF 应用程序,我认为 WPF 很难弄清楚我在这里要做什么。我还没有尝试过的一件事是使用自定义入口点制作一个实际的 WPF 应用程序(另一个程序集),因此我的类库可以在某种“空闲”模式下“启动”WPF 应用程序,该模式只是等待窗口被实例化并显示。这会奏效还是会浪费大量时间?

4

0 回答 0