Различные точки входа mscoree.dll на рабочем столе и на устройстве? - PullRequest
0 голосов
/ 08 марта 2009

В проекте смарт-устройства Я пытаюсь определить функцию, которая предположительно должна быть доступна в mscoree.dll. Соответствующее определение выглядит следующим образом:

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

Вы найдете это с Reflector во внутреннем классе EE в mscorlib.dll. Обратите внимание, что эта функция вызывается из Object.GetHashCode ().

У меня есть тестовый проект для интеллектуального устройства , который косвенно вызывает Object_GetHashCode. Когда я запускаю его на рабочем столе, все работает нормально. Когда я запускаю его на эмуляторе, я получаю следующую ошибку:

System.MissingMethodException: не удается найти точку входа «# 29» в DLL-файле PInvoke «mscoree.dll».

Почему это происходит? Разве точно не работает mscorlib.dll на эмуляторе и на рабочем столе? Кажется, потому что, когда я смотрю на реализацию Object.GetHashCode (), которая поставляется с mscorlib.dll, распространяемой внутри NETCFv35.ppc.armv4.cab, я вижу, что она также вызывает EE.Object_GetHashCode (). Почему mscorlib.dll может вызвать mscoree.dll, а я нет?

EDIT

Ссылка mscorlib в проекте Visual Studio указывает на следующий файл,

C: \ Program Files \ Microsoft.NET \ SDK \ CompactFramework \ v3.5 \ WindowsCE \ mscorlib.dll (210 КБ)

, но по умолчанию Reflector показывает содержимое следующего файла:

C: \ Program Files \ Microsoft.NET \ SDK \ CompactFramework \ v3.5 \ Debugger \ BCL \ mscorlib.dll (920 КБ)

Эти файлы имеют разные реализации для System.Object.GetHashCode (). Первый просто пуст , а второй выглядит следующим образом:

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

На самом деле все методы в первом файле кажутся пустыми, а гораздо меньший размер указывает на то, что предыдущий файл является просто заполнителем, так что VS может что-то ссылаться?

Наконец, я попытался найти mscorlib.dll в файлах на эмуляторе, но безуспешно. В файле журнала установщика указано, что каталог установки - \ Windows, но mscorlib.dll нигде нет. Где этот материал?

В общем, мне трудно искать ответы, когда дело доходит до CF, не знаю почему?

P.S. Я пытаюсь найти ответ на этот вопрос.

Ответы [ 4 ]

2 голосов
/ 11 марта 2009

Вы просто не можете сделать некоторые предположения, что точки входа будут когда-либо в том же самом порядковом номере. На самом деле неразумно предполагать, что они останутся одинаковыми в разных версиях одной и той же DLL даже на одной и той же платформе (это означает, что вызов порядкового номера 29 на рабочем столе может работать в этой версии, но функция, которую вы после, может легко переместить в следующей сборке когда он будет перекомпилирован и связан). Вызов по порядковому номеру - это путь, путь, путь хрупкий и рискованный.

0 голосов
/ 16 декабря 2009

Вы пытались проверить DLL с помощью Dependency Walker ? По крайней мере, это должно позволить вам заменить «# 29» на имя функции.

0 голосов
/ 11 марта 2009

Могу я задать глупый вопрос? Почему вы пытаетесь P / Invoke Object.GetHashCode()? Если у меня есть объект типа Object, я могу вызвать метод непосредственно из управляемого кода, P / Invoke не требуется.

0 голосов
/ 08 марта 2009

В устройствах Windows CE функции Win32 не обязательно находятся в тех же файлах DLL, что и их эквиваленты на рабочем столе. Большинство функций находятся в coredll.dll. Попробуйте это первым. Если это не работает, вам нужно найти имя DLL в устройстве Windows CE. MSDN может быть полезным. Также попробуйте документацию для Platform Builder.

...