Перекомпиляция DLL OpenXmlSdkTool.Core с ошибкой анонимного метода и делегата

Я изучаю OpenXmlSdkTools v2.5 и заглянул внутрь OpenXmlSdkTools.Core.DLL и сохранил его как проект c# с помощью ILSpy.

Пока этот вопрос активен, вот OpenXmlSdkTools.Core.DLL как способ чтобы быстро воспроизвести проблему, с которой я столкнулся.

Когда я пытался скомпилировать проект библиотеки одного класса, я получаю две ошибки, связанные с отсутствующей ссылкой на сборку «System.Xaml». например:

Тип «System.Windows.Markup.IQueryAmbient» определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку System.Xaml

Тип «System.Windows.Markup.IUriContext» определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку System.Xaml

Поэтому я добавил реф.

После этого я застрял на том, что, я надеюсь, является последней ошибкой компиляции, и я не могу понять это.

Невозможно преобразовать анонимный метод в тип System.Delegate, поскольку он не является типом делегата C:\TFS\ABC\src\OpenXmlSdkTool.Core\DocumentFormat.OpenXml.Tools\ApplicationExtensions.cs 10

Вот код:

using System;
using System.Windows;
using System.Windows.Threading;
namespace DocumentFormat.OpenXml.Tools
{
    public static class ApplicationExtensions
    {
        public static void DoEvents(this Application application)
        {
            application.Dispatcher.Invoke(DispatcherPriority.Background, delegate
            {
            });
        }
    }
}

Я застрял и озадачен тем, что это декомпилированная DLL, которую легко перекомпилировать. Вы думаете, что я добавил ссылку на Xaml, что вызвало эту проблему? И зачем мне нужно добавлять ссылку на Xaml, если Core.DLL — это проект библиотеки классов, а ILSpy не включил его в файл csproj?

Я просмотрел все остальные вопросы здесь с той же ошибкой, но ни один из них не помог.

Обновлять

Когда вы добавляете System.Xaml.dll в качестве ссылки на свой проект. Там интерфейс объявлен. Вот документ.

Итак, теперь я нахожусь в Catch22, если я добавлю dll Xaml, он решит первые 2 ошибки, но затем вызовет эту другую ошибку.


person Jeremy Thompson    schedule 31.08.2013    source источник
comment
Вы спрашиваете, как это исправить или почему это происходит?   -  person Vadim    schedule 31.08.2013


Ответы (1)


Воспроизведя проблему на своем компьютере, я обнаружил это http://staceyw1.wordpress.com/2007/12/22/they-are-anonymous-methods-not-anonymous-delegates/ (ссылка из Преобразовать этот делегат в анонимный метод или лямбду).

Добавление приведения к действию решило проблему

application.Dispatcher.Invoke(DispatcherPriority.Background, (Action)delegate
        {
        });

Но наверняка есть и другие решения.

person Vadim    schedule 31.08.2013
comment
Спасибо, что работает, вы получаете очки. Дайте мне знать, если у вас есть какие-либо идеи о том, почему декомпилированная dll нуждается в этом явно, а исходная DLL - нет? - person Jeremy Thompson; 31.08.2013
comment
Arhh, я вижу, что преобразование IL не работает в некоторых сценариях, например: метод в файле кода не компилируется"> stackoverflow.com/questions/4447582/ - person Jeremy Thompson; 31.08.2013