Dapper在应用程序中调用,并在DLL中调用抛出一个MissingMethodException

本文关键字:调用 MissingMethodException 一个 DLL 应用程序 并在 Dapper | 更新日期: 2023-09-27 18:10:31

我想知道为什么我的应用程序引用我创建的也使用Dapper的dll失败。我得到一个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到我的web应用程序的bin中,并在web项目中引用DLL。

我试图确保两者都使用相同版本的Dapper。

Dapper在应用程序中调用,并在DLL中调用抛出一个MissingMethodException

这听起来像是其中一个项目引用了底层的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",它应该工作