none
请教Win8+VS2012+.Net4.5环境下,在C++/CLI里调用WPF界面的问题 RRS feed

  • 问题

  • 我想尝试在C++/Cli 中使用WPF界面,参照《C++/Cli in Action》一书7.2节的介绍,使用“Deriving from a class in a C# DLL”方法引入WPF界面,编译通过,但在运行时弹出异常:

    组件“AppMaimWindow”不具有由UPI”/CSXalLibrary;compont/basewindow.xaml”识别的资源,

    请大家帮忙分析一下出错原因。

    编程的过程如下,

    1.使用Blend for Visual Studio 2012 建立WPF界面

    WPF -> WPF Control Library 名称设为 CSXamlLibrary

    2.点击“OK”后,在生成的工程中,删除自动生成的“UserControl1.xaml”,添加一个Window,名称设为BaseWindow.xaml

    3.  在生成的BaseWindow.xaml文件中,添加如下代码

    <Window x:Class="CSXamlLibrary.BaseWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="First Avalon App (dynamically load XAML)"
    Height="400" Width="400"
    ResizeMode="NoResize"
    >
    <Canvas>
    <ListBox Canvas.Left="10" Canvas.Top="10"
    Width="180" Height="350"
    Name="listbox" x:FieldModifier="protected" />
    <TextBox Canvas.Left="200" Canvas.Top="10"
    Width="180" Height="25"
    Name="textbox" x:FieldModifier="protected" />
    <Button Canvas.Left="200" Canvas.Top="45"
    Width="80" Height="25"
    Name="addbutton" x:FieldModifier="protected">Add</Button>
    </Canvas>
    </Window>
    4.编译工程,生成dll文件。

    5.打开Visual Studio 2012,开始编写VC++代码。先新建一个CLR Empty Project,执行如下步骤:

    创建新工程,类型为CLR Empty Project template

    SubSystem设为 /SUBSYSTEM:WINDOWS

          Entry Point 设为main

          添加reference:System;PresentationCore;PresentationFramework;WindowsBase;System.xaml和刚才在Blend中生成的DLL文件。

          同时添加刚才在Blend中生成的DLL文件。

    6.添加如下三个文件代码

    7.上述步骤完成后,对程序进行编译,可以通过,但是,运行程序,则出现下面所示的异常:


    2013年7月5日 2:42

答案

  • 您好,

    WPF的程序中包含Xaml的文件会生成压缩的baml文件,作为资源文件打包在Dll中,在解析WPF程序的时候,需要解析baml文件生成对应的类,看你的错误提示,应该是无法转化baml文件,因为自动生成的类需要去查找Xaml文件生成的baml文件。


    Thanks! Damon.Tian

    2013年7月25日 7:21

全部回复

  • C++写的WPF?!好神奇的东西,虽然我看不懂这个错误。

    会不会是xaml 只能识别C#和VB语言,clr中的东西不能完美的转换啊

    2013年7月9日 7:23
  • 我是按照书里的例程写的。生成的WPF是C#的,是C++调用的WPF的DLL文件。我也是刚接触,也不太明白,但感觉既然都是.NET的语言,应该还是可以的。
    2013年7月15日 8:28
  • 您好,

    WPF的程序中包含Xaml的文件会生成压缩的baml文件,作为资源文件打包在Dll中,在解析WPF程序的时候,需要解析baml文件生成对应的类,看你的错误提示,应该是无法转化baml文件,因为自动生成的类需要去查找Xaml文件生成的baml文件。


    Thanks! Damon.Tian

    2013年7月25日 7:21
  • 谢谢您的回答,我按照您的解释再想想,谢谢。
    2013年7月29日 13:19