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", и это должно работать.