Dapper вызывается в приложении и вызывается в DLL, вызывает исключение MissingMethodException

Мне интересно, почему мое приложение, которое ссылается на созданную мной DLL, которая также использует Dapper, не работает. Я получаю Method not found: 'System.Collections.Generic.IEnumerable'1<!!0> Dapper.SqlMapper.Query(System.Data.IDbConnection, System.String, System.Object)'. сообщение об ошибке. Когда я отслеживаю это до кода обидчика, кажется, что он находится в DotPdfInvoideLayout.dll @ InvoiceManager.LoadData()Ниже приведен код для метода, который не работает, потому что я называю это DLL, трассировка стека указывает на последнюю фигурную скобку метода. Линия 1988. Я предполагаю, что моей настоящей проблемой является линия, которая делает вызов Query()

public void loadData(IEnumerable<IPdfRenderable> textBoxes)
{
    var conn = new SqlConnection("Server=something;DataBase=TRIMS;UID=user;Password=password;");
    var output = conn.Query<TRIMNameAddressMaster>("Select top 1 * from Trims.dbo.TRIMNAMEADDRESSMASTER where id =  '" + _transaction.strap + "'", null).FirstOrDefault();

    var type = output.GetType();

    var properties = type.GetProperties();


    var r = new System.Text.RegularExpressions.Regex(@"((?<=\{)[^}]*(?=\}))+");



    foreach (var textbox in textBoxes)
    {

        var matches = r.Matches(((PdfTextBox)textbox).Text);

        foreach (Match match in matches)
        {
            try
            {
                var p = properties.Single(pi => pi.Name.ToLower() == match.Value.ToLower());
                ((PdfTextBox)textbox).Text = ((PdfTextBox)textbox).Text.Replace(
                    "{" + match.Value + "}", (p.GetValue(output, null) ?? string.Empty).ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine("No Mapping occurred" + match.Value);
            } 
        }

    }
}

Как консольное приложение DotPdfInvoiceLayout отлично работает Я удалил Main() и изменил свойства проекта, чтобы запустить его как библиотеку классов, затем скопировал сгенерированную dll в корзину моего веб-приложения и сослался на dll в веб-проекте.

Я пытался убедиться, что оба используют одну и ту же версию Dapper.

1 ответ

Решение

Похоже, что один из проектов ссылается на библиотеку 3.5 нижнего уровня, а один - на библиотеку 4.0/4.5 верхнего уровня. У нас намеренно настроен проект.NET 3.5 для использования только синтаксиса C# 3.0 - хотя в некотором смысле это на самом деле устаревшая вещь "со дня на день", когда dapper был развернут как файл кода, а не как сборка. Как следствие использования C# 3.0, он не имеет того же уровня поддержки для необязательных параметров, поэтому вместо него используются перегрузки. Эти перегрузки просто никогда не существовали в библиотеке 4.0/4.5. В связи с этим проект 3.5 напрямую не взаимозаменяем с проектом 4.0.

Измените проекты так, чтобы они оба были нацелены на один и тот же уровень.net в терминах "dapper", и это должно работать.

Другие вопросы по тегам