Dapper가 응용 프로그램에서 호출하여 DLL에서 MissingMethodException을 발생시킵니다.

c# dapper dll missingmethodexception

문제

나는 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로 호출하기 때문에 Stack Trace는 다음을 가리 킵니다. 메서드의 마지막 중괄호. Line 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의 동일한 버전을 사용하고 있는지 확인하려고 노력했습니다.

수락 된 답변

이것은 프로젝트 중 하나가 하위 레벨 3.5 라이브러리를 참조하고 있고 하나가 상위 레벨 4.0 / 4.5 라이브러리를 참조하고있는 것 같습니다. 우리는 intentioanally C # 3.0 구문만을 사용하도록 구성된 .NET 3.5 프로젝트를 가지고 있습니다. 어떤면에서는 이것이 dapper가 어셈블리가 아닌 코드 파일로 배포되었을 때의 "과거의 일"에서 나온 유산입니다. C # 3.0 사용의 결과로 선택적 매개 변수에 대한 지원 수준이 같지 않으므로 오버로드가 대신 사용됩니다. 이러한 오버로드는 단순히 4.0 / 4.5 라이브러리에 존재하지 않았습니다. 이 때문에 3.5 프로젝트는 4.0 프로젝트와 직접 상호 교환 할 수 없습니다.

프로젝트를 변경하여 ".dpper"라는 측면에서 동일한 .net 수준을 목표로 삼으십시오. 그러면 제대로 작동합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow