System.MissingMethodException: Metode tidak ditemukan?


245

Apa yang dulu berfungsi di aplikasi webform.net asp.net saya sekarang melempar kesalahan ini:

System.MissingMethodException: Metode tidak ditemukan

The DoThismetode adalah pada kelas yang sama dan harus bekerja.

Saya memiliki penangan generik seperti itu:

public class MyHandler: IHttpHandler
{
    public void Processrequest(HttpContext context)
    {
      // throws error now System.MissingMethodException: Method not found?
      this.DoThis(); 
    }

    public void DoThis()
    {
    //
    }
}

Anda dapat memposting beberapa kode lagi, karena kode ini tidak valid.
mironych

2
Apa somepage? Seperti yang 'terdengar' dicatat, kode ini tidak valid. Tolong beri kami cuplikan kode lengkap yang menunjukkan masalah.
Amy

Jawaban:


389

Ini adalah masalah yang dapat terjadi ketika ada versi lama dari DLL yang masih ada di sekitar. Pastikan bahwa majelis terbaru dikerahkan dan tidak ada majelis duplikat yang lebih tua bersembunyi di folder tertentu. Taruhan terbaik Anda adalah menghapus setiap item yang dibangun dan membangun kembali / memindahkan seluruh solusi.


62
Khususnya, pastikan versi lama tidak ada di GAC.
ladenedge

7
Juga, jika Anda bekerja dalam kasus malang di mana Anda memiliki perpustakaan yang tergantung pada perpustakaan, yang tergantung pada perpustakaan, dll. Kemudian pastikan untuk Bersihkan / Bangun kembali semua perpustakaan bergantung dengan versi yang sama dari yang mana dll, NHibernate dalam kasus saya ...
Serj Sagan

2
Memutakhirkan kerangka kerja .NET target untuk proyek juga dapat memperbaiki kesalahan. Saya memutakhirkan penargetan proyek MVC4 / Web API 1 .NET 4.5. Setelah memutakhirkan semua dependensi MVC, Web API, dan Entity Framework, saya mengalami kesalahan yang sama; mengubah kerangka target menjadi .NET 4.5.1 membuat kesalahan hilang.
Sergey K

1
Itu terjadi pada saya ketika saya menggunakan hanya file exe yang diubah dan tidak menyebarkan dll pembantu karena tidak ada perubahan kode - tetapi telah dibangun kembali. Saya menggunakan dll yang dibangun kembali dan kesalahan hilang. Saya telah melakukan penyebaran lain tanpa menggunakan kembali dll yang tidak berubah dan tidak memiliki masalah jadi saya masih tidak yakin persis apa yang terjadi di sini. Saya kira hal yang aman untuk dilakukan adalah menyebarkan file yang dibangun kembali tidak peduli apakah ia memiliki perubahan kode yang mendasarinya atau tidak.
Ho Ho Ho

14
Saya merasa berguna untuk membuka Debug -> Windows -> Modul ketika debugging untuk melihat dari mana perakitan sedang diambil.
JamesD

32

⚠️ Versi Paket Nuget Salah ⚠️

Saya memiliki proyek unit test yang menarik dalam paket akses data EF Nuget internal perusahaan kami dan kode itu menarik paket eksternal yang versinya jauh di belakang versi saat ini.

Masalahnya adalah bahwa pengaturan Nuget untuk paket diatur ke least version; dan versi yang lebih lama menang dan digunakan selama operasi ....

Oleh karena itu diam-diam mendapat versi yang salah untuk perakitan umum yang digunakan oleh paket dan aplikasi.


💡 Solusi 💡

Dengan Mengatur / memperbarui paket di Nuget untuk menggunakan dan [mendapatkan] yang terbaru , perbaiki masalah.


1
Ini memperbaikinya untuk saya. Mengelola paket untuk solusi tidak berhasil, tetapi saya harus memperbarui setiap proyek secara individual.
aoakeson

Proyek unit test saya merujuk versi baru dari proyek saya yang sebenarnya
Rhyous

26

Saya mengatasi masalah ini dengan menginstal versi .NET Framework yang benar di server. Situs web ini berjalan di bawah versi 4.0 dan majelis yang dihubungi dikompilasi untuk 4.5. Setelah menginstal .NET Framework 4.5 dan meningkatkan situs web ke 4.5, semua berfungsi dengan baik.


2
beberapa masalah dengan sasaran NET 3.5 kompilasi dan diinstal NET 3. Saya benar-benar heran mengapa ada peringatan ada yang lebih mendasar pada saat startup ...
Martin Meeser

Untuk .NET Framework versi> 4.0, Anda perlu menentukan unit penyimpanan stok (SKU), ini menunjukkan versi .NET Framework yang ditargetkan oleh aplikasi. docs.microsoft.com/en-us/dotnet/framework/configure-apps/…
bgcode

21

Restart Visual Studio sebenarnya memperbaikinya untuk saya. Saya pikir itu disebabkan oleh file assembly lama yang masih digunakan, dan melakukan "Clean Build" atau restart VS harus memperbaikinya.


5

Saya memiliki ini terjadi pada saya dengan file yang direferensikan di majelis yang sama, bukan dll yang terpisah. Setelah saya mengecualikan file dari proyek dan kemudian memasukkannya lagi, semuanya bekerja dengan baik.


5

Saya baru saja menjalankan ini pada proyek .NET MVC. Penyebab utama adalah versi yang bertentangan dari paket NuGet. Saya punya solusi dengan beberapa proyek. Masing-masing proyek memiliki beberapa paket NuGet. Dalam satu proyek saya memiliki versi dari paket Semantic Logging Enterprise Library, dan di dua proyek lain (yang merujuk pertama) saya memiliki versi yang lebih lama dari paket yang sama. Semuanya mengkompilasi tanpa kesalahan, tetapi memberikan kesalahan "Metode tidak ditemukan" yang misterius ketika saya mencoba menggunakan paket.

Cara mengatasinya adalah dengan menghapus paket NuGet lama dari dua proyek, sehingga hanya termasuk dalam satu proyek yang benar-benar membutuhkannya. (Juga saya melakukan pembangunan kembali yang bersih dari seluruh solusi.)


5

Periksa Referensi Anda!

Pastikan bahwa Anda secara konsisten menunjuk ke perpustakaan pihak ke-3 yang sama (jangan hanya mempercayai versi, lihat jalannya) di seluruh proyek solusi Anda.

Misalnya, jika Anda menggunakan iTextSharp v.1.00.101 dalam satu proyek dan Anda NuGet atau referensi iTextSharp v1.00.102 di tempat lain Anda akan mendapatkan jenis kesalahan runtime yang entah bagaimana menetes ke dalam kode Anda.

Saya mengubah referensi saya ke iTextSharp di ketiga proyek untuk menunjuk ke DLL yang sama dan semuanya bekerja.


Bagi saya itu berfungsi dengan baik untuk Bersihkan proyek dan menghapus dan Tambahkan beberapa referensi sekali lagi
Honza P.

Ini khususnya masalah dengan VS 2017 karena sering menawarkan Anda untuk menambahkan referensi yang menetapkan jalur sumber ke folder output proyek lain dalam solusi, bukan folder output dari rakitan referensi.
Tn. TA

4

Jika mengembangkan dengan server NuGet Anda sendiri, pastikan semua versi perakitan semuanya sama:

[assembly: AssemblyVersion("0.2.6")]
[assembly: AssemblyFileVersion("0.2.6")]
[assembly: AssemblyInformationalVersion("0.2.6")]

Bagaimana saya memeriksanya?
SerG

Saya pikir di nupkg.
sennett


3

Sudahkah Anda mencoba mematikan jika dinyalakan kembali? Lelucon di samping itu, menyalakan kembali komputer saya adalah apa yang sebenarnya melakukan trik untuk saya dan tidak disebutkan dalam jawaban lainnya.


3

Saya baru saja mengalami masalah ini dan ternyata itu karena saya mereferensikan versi DLL sebelumnya dari proyek UI saya. Karena itu, ketika menyusunnya senang. Tetapi ketika menjalankannya menggunakan DLL versi sebelumnya.

Periksa referensi pada semua proyek lain sebelum berasumsi Anda perlu membangun kembali / membersihkan / memindahkan solusi Anda.


2

Dalam kasus saya itu adalah masalah salin / tempel. Saya entah bagaimana berakhir dengan konstruktor PRIVATE untuk profil pemetaan saya:

using AutoMapper;

namespace Your.Namespace
{
    public class MappingProfile : Profile
    {
        MappingProfile()
        {
            CreateMap<Animal, AnimalDto>();
        }
    }
}

(perhatikan "publik" yang hilang di depan aktor)

yang dikompilasi dengan sangat baik, tetapi ketika AutoMapper mencoba untuk membuat instance profil, ia tidak dapat (tentu saja!) menemukan konstruktor!


@RenaudGauthier mungkin saya salah membaca sesuatu pada jawaban Jon Skeets, tetapi ia menyatakan bahwa kelas tanpa pengubah akses bersifat internal, dan dalam komentar ia benar-benar menyatakan "Tidak bukan. Jika Anda mendeklarasikan konstruktor dan tidak menentukan aksesibilitas, itu akan bersifat pribadi. Lihat bagian 10.3.5 dari spesifikasi C # ". Jadi saya kira konstruktor saya pribadi setelah semua? Harap perbaiki saya jika saya salah. Dan ya jawaban saya di luar konteks, saya datang ke sini dari Pertanyaan lain (yang tidak memberikan jawaban untuk saya). Saya akan menambahkan tautan ke jawaban saya di sana juga.
DaBeSoft

Anda memang benar, tidak apa-apa, saya sudah menghapus komentar yang tidak berguna.
Renaud Gauthier

1

Saya memiliki skenario yang sama di mana saya mendapatkan pengecualian yang sama dilemparkan. Saya punya dua proyek dalam solusi aplikasi web saya, dinamai, misalnya, DAL dan DAL.CustSpec. Proyek DAL memiliki metode bernama Method1, tetapi DAL.CustSpec tidak. Proyek utama saya memiliki referensi ke proyek DAL dan juga referensi ke proyek lain bernama AnotherProj. Proyek utama saya menelepon ke Method1. Proyek AnotherProj memiliki referensi ke proyek DAL.CustSpec, dan bukan proyek DAL. Konfigurasi Bangun memiliki proyek DAL dan DAL.CustSpec yang dikonfigurasi untuk dibangun. Setelah semuanya dibangun, proyek aplikasi web saya memiliki rakitan AnotherProj dan DAL di folder Bin-nya. Namun, ketika saya menjalankan situs web, folder ASP.NET Sementara untuk situs web memiliki perakitan DAL.CustSpec dalam file-nya dan bukan perakitan DAL, untuk beberapa alasan. Tentu saja, ketika saya menjalankan bagian yang bernama Method1, saya menerima kesalahan "Metode tidak ditemukan".

Apa yang harus saya lakukan untuk memperbaiki kesalahan ini adalah mengubah referensi dalam proyek AnotherProj dari DAL.CustSpec menjadi hanya DAL, menghapus semua file dalam folder Temporary ASP.NET Files, dan kemudian memutar ulang situs web. Setelah itu, semuanya mulai bekerja. Saya juga memastikan bahwa proyek DAL.CustSpec tidak sedang dibangun dengan tidak mencentangnya di Build Configuration.

Saya pikir saya akan membagikan ini jika itu membantu orang lain di masa depan.


1

Saya menemukan situasi yang sama di situs web ASP.NET saya. Saya menghapus file yang diterbitkan, memulai kembali VS, membersihkan dan membangun kembali proyek lagi. Setelah publikasi berikutnya, kesalahan itu hilang ...


1

Saya memecahkan masalah ini dengan membuat rak dengan perubahan saya dan menjalankan TFS Power Tools 'hangus' di ruang kerja saya ( https://visualstudiogallery.msdn.microsoft.com/f017b10c-02b4-4d6d-9845-58a06545627f ). Kemudian saya menghapus perubahan dan mengkompilasi ulang proyek. Dengan cara ini Anda akan membersihkan semua 'pihak yang menggantung' yang mungkin ada di ruang kerja Anda dan akan memulai dengan yang baru. Tentu saja ini mengharuskan Anda menggunakan TFS.


1

Mungkin juga masalahnya adalah dengan parameter atau tipe pengembalian metode yang dilaporkan hilang, dan metode "hilang" itu sendiri baik-baik saja.

Itulah yang terjadi dalam kasus saya, dan pesan yang menyesatkan membuatnya butuh waktu lebih lama untuk mencari tahu masalahnya. Ternyata perakitan untuk tipe parameter memiliki versi yang lebih lama di GAC, tetapi versi yang lebih tua sebenarnya memiliki nomor versi yang lebih tinggi karena perubahan skema penomoran versi yang digunakan. Menghapus versi yang lebih lama / lebih tinggi dari GAC memperbaiki masalah.


1

Menggunakan Costura.Fody 1.6 & 2.0:
Setelah membuang banyak waktu untuk melihat jenis kesalahan yang sama dengan semua solusi potensial lainnya yang tidak berfungsi, saya menemukan bahwa versi DLL yang saya tempel sebelumnya berada di direktori yang sama dengan yang saya jalankan. .exe baru dikompilasi dari. Rupanya mencari file lokal di direktori yang sama terlebih dahulu, kemudian mencari ke dalam ke perpustakaan yang tertanam. Menghapus DLL lama berhasil.

Untuk lebih jelasnya, bukan karena referensi saya menunjuk ke DLL lama, itu adalah bahwa salinan DLL lama ada di direktori tempat saya menguji aplikasi saya dari pada sistem yang terpisah dari apa yang dikompilasi.


1

Dalam kasus saya itu adalah folder dengan DLL yang lebih tua dengan nama yang sama yang direferensikan dalam file .csproj saya meskipun path secara eksplisit diberikan mereka entah bagaimana dimasukkan oleh karena itu beberapa versi DLL yang sama mengalami konflik.



1

Dalam kasus saya, MissingMethodException adalah untuk metode yang ada di file yang sama!

Namun, saya baru saja menambahkan paket NuGet yang menggunakan. Net Standard2 ke proyek penargetan 4.7.1 saya, yang menyebabkan konflik versi untuk System.Net.Http (4.7.1: versi 4.0.0.0, paket NuGet menggunakan .NET Standar 2 ingin 4.2.0.0). Hal ini tampaknya diketahui sebagai masalah yang seharusnya lebih baik di 4.7.2 (lihat catatan 2) .

Saya telah menggunakan pengalihan yang mengikat seperti ini di semua proyek saya lainnya, karena ada pengecualian segera setelah mencoba memuat 4.2.0.0 yang tidak saya miliki:

  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
  </dependentAssembly>

Kecuali dalam proyek yang satu ini, di mana tampaknya ia mencoba memuat System.Net.Http hanya saat memanggil fungsi lokal yang menggunakan System.Net.Http.HttpResponseMessage sebagai parameter atau tipe pengembalian (parameter saat debugging, ketik kembali ketika saya menjalankan tes tanpa debugger, juga agak aneh). Dan alih-alih menunjukkan pesan bahwa ia tidak dapat memuat versi 4.2.0.0 dari System.Net.Http, ia mengembalikan pengecualian ini.


0

Ini terjadi pada saya menggunakan MVC4, dan saya memutuskan setelah membaca utas ini untuk mengubah nama objek yang melempar kesalahan.

Saya melakukan pembersihan dan membangun kembali dan mencatat bahwa itu melewatkan dua proyek. Ketika saya membangun kembali salah satu dari mereka, ada kesalahan di mana saya memulai fungsi dan tidak menyelesaikannya.

Jadi VS mereferensikan model yang telah saya tulis ulang tanpa bertanya apakah saya ingin melakukan itu.


0

Kalau-kalau itu membantu siapa pun, meskipun ini masalah lama, masalah saya agak aneh.

Saya memiliki kesalahan ini saat menggunakan Jenkins.

Akhirnya menemukan bahwa tanggal sistem secara manual diatur ke tanggal di masa depan, yang menyebabkan dll dikompilasi dengan tanggal di masa depan. Ketika tanggal diatur kembali ke normal, MSBuild menafsirkan bahwa file itu lebih baru dan tidak memerlukan kompilasi ulang proyek.


0

Saya mengalami masalah ini, dan apa yang bagi saya adalah satu proyek menggunakan Daftar yang ada di contoh. Namespace Sensor dan dan tipe lain mengimplementasikan antarmuka ISensorInfo. Kelas Type1SensorInfo, tetapi kelas ini adalah satu lapisan lebih dalam di namespace di Example.Sensors.Type1. Ketika mencoba untuk membatalkan deserialisasi Type1SensorInfo ke dalam daftar, itu melemparkan pengecualian. Ketika saya menambahkan menggunakan Example.Sensors.Type1 ke dalam antarmuka ISensorInfo, tidak ada lagi pengecualian!

namespace Example
{
    public class ConfigFile
    {
        public ConfigFile()
        {
            Sensors = new List<ISensorInfo<Int32>>();
        }
        public List<ISensorInfo<Int32>> Sensors { get; set; }
     }
   }
}

**using Example.Sensors.Type1; // Added this to not throw the exception**
using System;

namespace Example.Sensors
{
    public interface ISensorInfo<T>
    {
        String SensorName { get; }
    }
}

using Example.Sensors;

namespace Example.Sensors.Type1
{
    public class Type1SensorInfo<T> : ISensorInfo<T>
    {
        public Type1SensorInfo() 
    }
}

0

Saya memiliki hal yang sama terjadi ketika saya memiliki sejumlah proses MSBuild berjalan di latar belakang yang secara efektif crash (mereka memiliki referensi ke versi kode lama). Saya menutup VS dan membunuh semua proses MSBuild dalam explorer proses dan kemudian dikompilasi ulang.


0

Saya punya proyek uji yang mereferensikan 2 proyek lain yang masing-masing mereferensikan versi yang berbeda (di lokasi yang berbeda) dari dll yang sama. Ini membingungkan kompiler.


0

Dalam kasus saya spotify.exe menggunakan port yang sama yang ingin digunakan proyek api web saya pada mesin pengembangan. Nomor port adalah 4381.

Saya keluar dari Spotify dan semuanya bekerja dengan baik lagi :)



0

Dalam kasus saya, tidak ada perubahan kode sama sekali dan tiba-tiba salah satu server mulai mendapatkan ini dan hanya pengecualian ini (semua server memiliki kode yang sama, tetapi hanya satu yang mulai mengalami masalah):

System.MissingMethodException: Method not found: '?'.

Tumpukan:

Server stack trace: 
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at myAccountSearch.AccountSearch.searchtPhone(searchtPhoneRequest request)
   at myAccountSearch.AccountSearchClient.myAccountSearch.AccountSearch.searchtPhone(searchtPhoneRequest request)
   at myAccountSearch.AccountSearchClient.searchtPhone(String ID, String HashID, searchtPhone Phone1)
   at WS.MyValidation(String AccountNumber, String PhoneNumber)

Masalah yang saya yakini rusak AppPool - kami memiliki daur ulang AppPool otomatis yang terjadi setiap hari pada jam 3 pagi dan masalah dimulai pada jam 3 pagi dan kemudian berakhir dengan sendirinya pada jam 3 pagi hari berikutnya.


0

Harus berupa bug referensi dari Microsoft.

Saya membersihkan, membangun kembali semua perpustakaan saya dan masih mendapatkan masalah yang sama dan tidak bisa menyelesaikan ini.

Yang saya lakukan hanyalah menutup Aplikasi Visual Studio dan membukanya lagi. Itu berhasil.

Sangat menyebalkan bahwa masalah sederhana seperti itu dapat membutuhkan waktu lama untuk diperbaiki karena Anda tidak akan berpikir bahwa itu akan menjadi sesuatu seperti itu.


0

Dalam kasus saya, proyek saya merujuk Microsoft.Net.Compilers.2.10.0. Ketika saya beralih ke Microsoft.Net.Compilers.2.7.0, kesalahan hilang. Benar-benar kesalahan misterius dengan berbagai penyebab.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.