根据 MSDN,看起来我刚刚撞到的墙是坚固的:
http://msdn.microsoft.com/en-us/library/system.reflection.assembly.getentryassembly.aspx
从非托管应用程序加载托管程序集时,GetEntryAssembly 方法可以返回 null。例如,如果非托管应用程序创建用 C# 编写的 COM 组件的实例,则从 C# 组件调用 GetEntryAssembly 方法将返回 null,因为进程的入口点是非托管代码而不是托管程序集。
在我决定开始使用ResourceDictionary
andMergedDictionaries
之前,我有很多很多冗余的 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, XamlValueConverter
1 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 应用程序,该模式只是等待窗口被实例化并显示。这会奏效还是会浪费大量时间?