编程语言
首页 > 编程语言> > C#-使用WPF的CodeDom-运行时错误

C#-使用WPF的CodeDom-运行时错误

作者:互联网

我有一个项目,其中使用Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider编译内存中的许多文件

我开始尝试使用wpf Windows时发生了我的问题.

我可以编译内存中的程序集,但是当我打开该窗口时,我得到:

System.Exception: The component ‘Dynamic.DragonListForm’ does not have
a resource identified by the URI
‘/ScriptCode;component/wpf_ui/dragonlistform.xaml’.
at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)

注意:我通过添加特定文件夹中所有.cs文件的列表进行编译

objCompileResults = objCodeCompiler.CompileAssemblyFromFile( objCompilerParameters, files.ToArray() );

我还添加了使它工作所需的dll引用.

注意:感谢Reed,通过执行以下操作,我可以使其充分满足我的需求:

 List<string> bamlFiles = Directory.GetFiles( directoryPath, "*.baml", SearchOption.AllDirectories ).ToList();
 bamlFiles.ForEach( x => objCompilerParameters.EmbeddedResources.Add( x ) );

在我的项目中,这已经足够了.我有一个.NET应用程序,用于执行语音命令.通常,我拥有它,因此可以在更改语音命令时重新编译内存中的程序集更改.我想其中的某些功能不适用于WPF,但是现在我可以在内存装配中使用WPF窗口了.

解决方法:

问题在于WPF文件不仅是C#,而且还是XAML,然后将其在单独的MSBuild任务中编译为BAML资源并作为嵌入式资源包含在内.

如果要支持此版本,则需要将所有引用的xaml包括在内.有关如何使用CodeDom进行操作的详细信息,请参见this post.

完成此操作后,您还必须确保使用兼容的机制来加载类型. C#编译xaml / xaml.cs文件的“正常”方式在您的情况下不起作用,因为它需要将资源预先编译为baml.您必须有效地“重写” C#类型的代码以使用不同的加载XAML的机制-通常,这可以通过使用XamlObjectReader和XamlObjectWriter读取xaml内容并将其“写入”对象来完成. InitializeComponent传递.

标签:codedom,wpf,c
来源: https://codeday.me/bug/20191026/1935366.html