0

akıllı aygıt projesinde Msvree.dll dosyasında olması gereken bir işlevi Pinvoke çalışıyorum. Sen mscorlib.dll iç sınıf EE içerisinde Reflektör bu bulacaksınızMasaüstünde ve bir aygıtta farklı mscoree.dll giriş noktaları var mı?

[DllImport("mscoree.dll", EntryPoint = "#29")] 
internal static extern int Object_GetHashCode(object obj); 

şu şekildedir: ilişkili tanımıdır. Bu işlevin Object.GetHashCode() den çağrıldığını unutmayın.

Dolaylı olarak Object_GetHashCode'u çağırdığı bir akıllı cihaz test projesi var. Masaüstünde çalıştırdığımda her şey iyi çalışıyor. Bir öykünücü üzerinde çalıştırdığımda, aşağıdaki hatayı alıyorum:

System.MissingMethodException: PInvoke DLL 'mscoree.dll' içinde bir '# 29' giriş noktası bulamıyorum.

Bu neden oluyor? Tam olarak aynı mscorlib.dll emülatörde ve masaüstünde çalışmıyor mu? NETCFv35.ppc.armv4.cab içinde dağıtılan mscorlib.dll ile birlikte gelen Object.GetHashCode() uygulanmasına baktığımda o zaman aynı zamanda EE.Object_GetHashCode() çağırır göründüğü gibi görünüyor. Neden mscorlib.dll mscoree.dll içine çağrı yapabilirsiniz ve yapamıyorum?

DÜZENLEME:

aşağıdaki dosyaya Visual Studio proje noktalarında mscorlib referans,

C: \ Program Files \ Microsoft.NET \ SDK \ CompactFramework v3.5 \ WindowsCE \ \

: C: \ Program Files \ Microsoft.NET \ SDK \ CompactFramework \ v3.5 \ Debugger \ BCL \ mscorlib mscorlib.dll (210KB)

ancak varsayılan Reflektör aşağıdaki dosyanın içeriğini gösterir. dll (92) 0kB)

Bu dosyalar System.Object.GetHashCode() için farklı uygulamalara sahiptir.

public virtual int GetHashCode() 
{ 
    return EE.Object_GetHashCode(this); 
} 

Aslında eski dosyadaki tüm yöntemler boş ve çok daha küçük boyutta görünmüyor eski dosya sadece olduğunu yöne doğru ipucu gibi görünüyor: İkinci görünüyor şöyle ederken eski basitçe boş olduğunu Bir yer tutucu, böylece VS bir şey referans olabilir?

Son olarak, emülatördeki dosyalarda mscorlib.dll dosyasını bulmaya çalıştım ancak başarısız oldu. Yükleyici günlük dosyası yükleme konumunun \ Windows olduğunu söylüyor ancak herhangi bir yerde mscorlib.dll yok. Bu şeyler nerede?

Genelde, CF'ye gelince cevaplar için uğraşıyorum, neden olmasın diye değil mi?

P.S. this sorusuna bir cevap bulmaya çalışıyorum.

+0

Mscoree.dll dosyasının doğru sürümünü buluyor musunuz? –

+0

Hayır, değilim. Dürüst olmak gerekirse, akıllı cihaz geliştirme ve CF için nispeten yeniyim ve yeniden dengelenebilirlik ve CF gelişiminin nasıl çalışması gerektiği gibi bazı çok temel şeyleri anlayamıyor olabilirler. Ayrıntılar için yukarıya bakınız (birkaç dakika içinde) . –

cevap

2

Sadece giriş noktalarının aynı sıralarda olacağı konusunda bazı varsayımlarda bulunamazsınız.Aslında aynı platformda bile aynı DLL sürümlerinde aynı kalacaktır (yani masaüstünde ordinal 29'u arayarak bu sürümde çalışabilir), ancak sonraki yapınızda kolayca hareket edebildiğiniz anlamına gelir. yeniden derlendiğinde ve bağlandığında). Ordinal tarafından çağrı yolu, yol, yol kırılgan ve riskli.

+0

Katılıyorum, ancak problemi çözebilmemin tek yolu gibi gözüküyordu (bkz. S.S.'de bağlantılı soruya bakın). Bundan nasıl kaçınabileceğime dair bir önerin var mı? –

0

Windows CE aygıtlarında Win32 işlevleri, mutlaka masaüstü eşdeğerleriyle aynı dll dosyalarında bulunmaz. İşlevlerin çoğu coredll.dll dosyasında bulunur. Önce bunu dene. Eğer çalışmıyorsa, Windows CE cihazında dll adını bulmanız gerekir. MSDN yararlı olabilir. Platform Builder'ın belgelerini de deneyin.

+0

Object_GetHashCode bir Win32 işlevi değil, değil mi? .NET compact framework'ün bir parçasıdır (mscoree.dll). Yine, nasıl mscorlib.dll (cihazda yüklü CF bir kısmı görünüşte) referans ve EE.Object_GetHashCode() çağrı ve yapamıyorum? Yanlış dosyalara bakıyorum mı? –

0

Aptalca bir soru sorabilir miyim? Neden P/Invoke Object.GetHashCode()'u deniyorsunuz? Object türünde bir nesnem varsa, yönetilen koddan doğrudan yöntemi arayabilirim, P/Çağırma gerekli değildir.

+0

Kesinlikle ** all ** koşullarının altında Object.GetHashCode() uygulamasını çağırmak gerekiyor. Yani, kendisinin GetHashCode() işlevini geçersiz kılan bir sınıf nesnesi olsa bile (örneğin, String). –

+0

Anlamı, bir nesnenin temel Object.GetHashCode(), sınıf özel bir geçersiz kılma değil mi çağırmanız gerekir? (Yoğun olduğum için üzgünüm). Yani ... bir nesneyi Object'e atayamaz ve GetHashCode'u bu şekilde arayamazsınız? – CBono

+0

"Bir nesnenin Object.GetHashCode() nesnesine, sınıf özel bir geçersiz kılma değil mi?" Tam olarak. GetHashCode sanal olarak Nesne Dökümü işe yaramaz. –

0

DLL'yi Dependency Walker kullanarak incelemeyi denediniz mi? En azından bu, "# 29" kelimesini işlevin adıyla değiştirmenize izin vermelidir.