Goober S. Johnsson Ответов: 1

Отсутствует сборка, но когда я добавляю ее, она говорит, что файл метаданных не может быть найден C# .NET


- Привет!

Похоже, я столкнулся с небольшой дилеммой, и это будет означать, что мое приложение не будет компилировать код C#, который мне нужен для компиляции

Если я не добавлю ссылку, она скажет

[The type or namespace name 'Window' could not be found (are you missing a using directive or an assembly reference?)


и когда я добавлю
PresentationFramework.dll


там написано
Metadata file 'PresentationFramework.dll' could not be found


Я провел некоторые исследования, и мне кажется, что
The type or namespace name 'Window' needs PresentationFramework.dll


Почему мое приложение выдает мне эту ошибку, когда я пытаюсь скомпилировать внутри своего приложения (не из VS)


Мой исходный код

using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Windows;


namespace SimpleBuilder
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// store code
    /// select what features
    /// print out textfile with all the code from the features
    /// compile that textfileContent to a exe
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        
        private void fakeMessageOne()
        {
            if(fakeMessageCheckbox.IsChecked == true)
            {
                fakeMessage1 fkmsg = new fakeMessage1();
                fkmsg.fakeMessage();
            }
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            
            

            CSharpCodeProvider csc = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", frameworkTextbox.Text } });
            CompilerParameters parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll" }, outputTextbox.Text, true);
            parameters.GenerateExecutable = true;
            parameters.ReferencedAssemblies.Add("Microsoft.CSharp.dll");
            parameters.ReferencedAssemblies.Add("System.dll");
            //parameters.ReferencedAssemblies.Add("PresentationFramework.dll"); commented this out since it wasnt working.

            CompilerResults result = csc.CompileAssemblyFromSource(parameters, sourceTextbox.Text);
            if (result.Errors.HasErrors)
            {
                result.Errors.Cast<CompilerError>().ToList().ForEach(error => errorTextbox.Text += error.ErrorText + "\r\n");
            }
            else
            {
                errorTextbox.Text = "--- Build Succeeded! ---";
            }

        }
    }
}


Код, который я пытаюсь скомпилировать

using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Windows;


namespace SimpleBuilder
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// store code
    /// select what features
    /// print out textfile with all the code from the features
    /// compile that textfileContent to a exe
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void fakeMessageOne()
        {
            Messagebox.Show("Hello World");
        }
    }
}


Что я уже пробовал:

Я сделал некоторые перечитывания о dll но не могу найти никаких других

Richard Deeming

Вы добавляете ссылку в Visual Studio или пытаетесь скомпилировать ее с помощью csc.exe командная строка?

Goober S. Johnsson

У меня уже есть он в VS, я пытаюсь добавить его через

параметры.ReferencedAssemblies.Добавить("PresentationFramework.dll");

1 Ответов

Рейтинг:
2

Richard Deeming

Проблема в том, что PresentationFramework.dll сборка не находится в каталоге, который находится в пути поиска компилятора. Вместо этого он находится в подкаталоге под названием "WPF" в главном каталоге фреймворка:

parameters.ReferencedAssemblies.Add("WPF\\PresentationFramework.dll");

Вам также понадобятся некоторые другие рекомендации:
parameters.ReferencedAssemblies.Add("System.Xaml.dll");
parameters.ReferencedAssemblies.Add("WPF\\WindowsBase.dll");
parameters.ReferencedAssemblies.Add("WPF\\PresentationCore.dll");

Вам также нужно будет исправить случай с MessageBox класс в вашем коде для компиляции.

После внесения этих изменений вы обнаружите одну ошибку компилятора:
The name 'InitializeComponent' does not exist in the current context

Это происходит потому, что ваш модуль компиляции не включает в себя никаких артефактов, которые Visual Studio генерирует для вас при создании нового окна WPF, включая BAML (скомпилированный XAML) и другая часть частичного класса.

Если вы посмотрите на существующий проект WPF в Проводнике Windows, вы увидите папку под названием obj. Под этим, в папке с тем же именем, что и конфигурация (типично Debug или Release), вы увидите, что каждое окно WPF имеет три файла, сгенерированных компилятором:
  • WindowName.baml - скомпилированная версия разметки XAML;
  • WindowName.g.cs - определяет поля, InitializeComponent способ загрузки BAML-код от внедренных ресурсов, и код для подключения поля к загруженному BAML-код;
  • WindowName.g.i.cs - кажется, это дубликат .g.cs, возможно, используется для Intellisense;

Поскольку вы генерируете код вручную, вам нужно будет каким-то образом дублировать эти артефакты или переместить код из .g.cs файл в ваш основной класс.


Goober S. Johnsson

Я видел учебник на YouTube, и он отлично работал для него, но потом он снова использовал приложение WinForm.

Richard Deeming

Да, WinForms намного проще, чем WPF. :)

Goober S. Johnsson

Можно ли смешивать как? Допустим, у меня есть приложение wpf, я все еще могу добавить к нему winForm, верно?

Richard Deeming

Да.

Goober S. Johnsson

Итак, что я мог бы сделать, так это создать то, что я опубликовал выше в приложении WinForm, и использовать его из моего приложения WPF?

Richard Deeming

Да. Вам просто нужно будет построить форму в коде, а не использовать конструктор.

Surawu

Я нахожу презентацию фреймворком.dll существует в GAC, почему компилятор не ищет GAC???