MissingMethodException
-
Hallo,
ich versuche in meinem Projekt für einen PocketPC eine Klassenbibliothek einzubinden. In der Methode wird ein ManualResetEvent verwendet. Beim Aufruf der Methode erhalte ich dann folgende Fehlermeldung
Der Typ 'System.Threading.EventWaitHandle' konnte nicht aus der Assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=969DB8053D3322AC' geladen werden.
Binde ich die Dateien aber direkt in das Projekt ein, läuft alles ganz gut durch. Woran kann das liegen?
-
Welche Dateien bindest Du denn ein ?
-
Ic habe mir selber eine Klassenbibliothek erstellt. Im wesentlichen steht folgendes drin:
public class IBSConnection : IIBSInterface, IDisposable { ldfReader ldf_reader; ILinInterface Lin; LIN_Version linVersion; ChechsumModel checksumModelStandard; byte DiagNAD = 0x01; int baudrate; static IBSConnection instance = null; static int instanceCnt = 0; ManualResetEvent manualResetEvent = new ManualResetEvent(true); LIN_Interface_Status lastError = LIN_Interface_Status.LIN_Interface_Success; public static IBSConnection CreateInstance(LIN_Interface Lin_interface, String InitFile, params object[] interfaceSettings) { if (instance == null) { instance = new IBSConnection(Lin_interface, InitFile, interfaceSettings); } instanceCnt++; return instance; } private IBSConnection(LIN_Interface Lin_interface, String InitFile, params object[] interfaceSettings) { if (File.Exists(InitFile)) { this.ldf_reader = new ldfReader(InitFile); this.baudrate = this.ldf_reader.LinSpeed; if (this.ldf_reader.LinVersion == 1.3) this.linVersion = LIN_Version.LIN_1_3; else if (this.ldf_reader.LinVersion == 2.0) this.linVersion = LIN_Version.LIN_2_0; else this.linVersion = LIN_Version.LIN_2_0; if (this.linVersion == LIN_Version.LIN_1_3) this.checksumModelStandard = ChechsumModel.LIN_Classic_Checksum; else this.checksumModelStandard = ChechsumModel.LIN_Enhanced_Checksum; switch (Lin_interface) { case LIN_Interface.RS232: Lin = RS232Lin.CreateInstance(LIN_Version.LIN_1_3, this.baudrate, interfaceSettings); break; case LIN_Interface.CanCardXL: Lin = new CanCardXLLin(LIN_Version.LIN_1_3); break; default: Lin = RS232Lin.CreateInstance(LIN_Version.LIN_1_3, 19200, "COM1"); break; } } } ... public bool GetFrame(int frameId, out double[] values) { try { this.manualResetEvent.WaitOne(); this.manualResetEvent.Reset(); byte[] data; values = null; Frame frame = this.ldf_reader.GetFrameById(frameId); if (frame == null) return false; values = new double[frame.ValueList.Count]; values.Initialize(); if ((this.lastError = this.Lin.MasterRequest((byte)frameId, (byte)frame.ValueList.Count, this.checksumModelStandard, out data)) != LIN_Interface_Status.LIN_Interface_Success) return false; for (int i = 0; i < values.Length; i++) { UInt64 value = this.ExtractData(frame.ValueList[i].FrameOffset, frame.ValueList[i].SignalLength, ref data); values[i] = (double)value * frame.ValueList[i].Resolution + frame.ValueList[i].Offset; } return true; } finally { this.manualResetEvent.Set(); } } . . .
Mit dem ManualResetEvent will ich verhindern, dass aus verschieden Threads gleichzeitig versucht wird Daten vom Sensor abzuholen.
Ich habe gerade nochmal versucht diese Assembly in einer Windows Form unter Xp zu verwenden, und da klappt es ebenfalls. Nur beim PocketPC haut es eben nicht hin und dafür wollte ich sie verwenden.
-
Laut MSDN wird das EventWaitHandle erst im CF 3.5 unterstützt. Das ManualResetEvent ab CF 1.0 (nutze es auch z.B. auf dem DTX-11).
Warum er jetzt aber auf die Idee kommt ein EventWaitHandle zu nutzen weiß ich nicht.
Stell mal sicher, das Du das richtige Framework verwendest, erstell Dir ein Minimalbeispiel und teste mal das hier:
http://www.rothmichael.de/cpp/ManualWaitHandle.zip
Getestet auf einem Symbol MC3000 CF2.0
-
OK....
man sollte schon das richtige Projekt für die Klassenbibliothek auswählen. Habe nochmals mein Projekt kontrolliert und hatte eine Windowsklassenbibliothek, anstatt eine Klassenbibliothek für Windows Mobile, ausgewählt.Jedenfalls besten Dank