Источник недоступен для декорированных методов Фоди

У меня есть следующий сценарий:

Решение

Где ProjectA — простая библиотека классов, а ProjectB — консольное приложение.

ProjectA.Class1.cs содержит следующий код:

using System;

namespace ProjectA
{
    public class Class1
    {
        public void A()
        {
            B();
        }

        [Weaver]
        public void B()
        {
            Console.WriteLine("I'm in B()");
        }
    }
}

ProjectA.Weaver.cs содержит:

using MethodDecorator.Fody.Interfaces;
using System;
using System.Reflection;

namespace ProjectA
{
    class Weaver : Attribute, IMethodDecorator
    {
        public void Init(object instance, MethodBase method, object[] args)
        {
            Console.WriteLine("Initialising");
        }

        public void OnEntry()
        {
            Console.WriteLine("Entry");
        }

        public void OnException(Exception exception)
        {
            Console.WriteLine("Exception");
        }

        public void OnExit()
        {
            Console.WriteLine("Exit");
        }
    }
}

И точка входа консольного приложения (ProjectB.Program.cs) содержит:

using ProjectA;

namespace ProjectB
{
    class Program
    {
        static void Main(string[] args)
        {
            var a = new Class1();

            a.A();
        }
    }
}

И ProjectA.FodyWeavers.xml содержит:

<?xml version="1.0" encoding="utf-8"?>
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
    <MethodDecorator></MethodDecorator>
</Weavers>

Если я поставлю точку останова внутри Class1.A() и попытаюсь Вступить (F11), появится следующее окно Источник недоступен:

Источник недоступен

Есть ли способ:

  • Предотвратить попытку отладчика войти в Weaver
  • Сообщите отладчику, где находится исходный код ткача.

Я пытался:

  • Включение Только мой код
  • Добавление атрибутов к методам Weaver.cs ([DebbugerNonUserCode], [DebbugerStepThrough], [DebbugerHidden]...)
  • Добавление ссылок Fody на ProjectB
  • Установка отладочной информации сборки проекта на Full

С использованием:

  • Visual Studio 2019 Community Edition
  • .NET Framework 4.7.2
  • Фоди 6.2.0
  • МетодDecorator.Fody 1.1.0

person Nelladel    schedule 14.06.2020    source источник
comment
Поместите точку останова в функции Init и B, и отладчик будет приостановлен. появляется source not filed, я думаю, потому что вы пытаетесь отлаживать код дизассемблирования, а не код С#.   -  person Mohammed Sajid    schedule 14.06.2020


Ответы (2)


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

Существует расширение для Visual Studio, позволяющее отключить окно «Источник недоступен», но переход в код будет выглядеть так, как будто Visual Studio просто откажется это делать (если только вы не щелкнете несколько раз, пока не дойдете до первого метода).

Тема на странице сообщества разработчиков Visual Studio: здесь.

Расширение «Отключить вкладку «Нет доступных источников»» находится здесь. также найдите его в Visual Studio, щелкнув вкладку Extensions, Manage Extensions, затем найдите «Отключить вкладку «Нет доступных источников»», затем нажмите «Установить».

Пока Visual Studio ничего не сделает с этим или не будет лучшего расширения, я бы предложил установить точку останова глубже в стек вызовов (например, установив точку останова на Init(object instance, MethodBase method, object[] args)).

person JJtheJJpro    schedule 14.06.2020

Новая версия MethodDecorator ткача ( v. 1.1.1) был выпущен, что устраняет эту проблему благодаря Тому Энглерту.

Ссылка на PR 254

Ссылка на проблему, поднятую на странице GH

person Nelladel    schedule 01.07.2020