Как Silverlight определяет сборку "Silverlight"? - PullRequest
11 голосов
/ 26 октября 2008

Я пытаюсь скомпилировать код из F # для использования в Silverlight. Я компилирую с:

- noframework --cliroot "C: \ program Files \ Microsoft Silverlight \ 2.0.31005.0" --standalone

Создает автономную сборку, которая ссылается на структуру SL. Но когда я пытаюсь добавить ссылку на сгенерированную сборку, я получаю эту ошибку:

Вы можете добавлять только ссылки на проекты в другие проекты Silverlight в решение.

Что делает плагин VS, чтобы определить, что это не сборка Silverlight? Вот манифест:

// Metadata version: v2.0.50727
.assembly extern mscorlib
{
  .publickeytoken = (7C EC 85 D7 BE A7 79 8E )                         // |.....y.
  .ver 2:0:5:0
}
.assembly FSSLLibrary1
{

  // --- The following custom attribute is added automatically, do not uncomment -------
  //  .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 01 00 00 00 00 ) 

  .hash algorithm 0x00008004
  .ver 0:0:0:0
}
.module 'F#-Module-FSSLLibrary1'
// MVID: {49038883-5D18-7281-A745-038383880349}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003       // WINDOWS_CUI
.corflags 0x00000001    //  ILONLY
// Image base: 0x04120000

Я не понимаю, что он находит, что ему не нравится; это чистый проверяемый IL. Я сравнил со сборкой SL "библиотеки классов", и она выглядит так же. Единственным отличием были некоторые атрибуты, но я удалил их, а VS все еще позволяет мне ссылаться на DLL. Я даже добавил непроверяемый IL в DLL-библиотеку SL, и она все еще загружалась.

Есть предложения?

Обновление: Я немного покопался, и, похоже, не имеет значения манифест. Это не нравится что-то в IL из библиотек FSharp. Они поддаются проверке, но что-то там вызывает отклонение.

Ответы [ 2 ]

7 голосов
/ 29 октября 2008

Ответ!

Очевидно, проблема в том, что при добавлении ссылки на bin \ Release или bin \ Debug Visual Studio (или система проекта Silverlight) решает попытаться сослаться на проект. Это терпит неудачу по любой причине.

Если вы скопируете выходную DLL F # в другое место, ссылка справится очень хорошо. (Конечно, это будет ссылка на файл, а не ссылка на проект.)

Затем настройте зависимости, чтобы сначала создавалась библиотека F #, затем вы можете использовать ссылку на файл, чтобы получить F # -генерированный двоичный файл.

Обновление: Еще одна очевидная проблема. Если я включаю оптимизацию кода, я получаю эту ошибку:

C:\test\SilverlightApplication1\FSC(0,0): error FS0193: internal error: the module/namespace 'System' from compilation unit 'mscorlib' did not contain the namespace, module or type 'MarshalByRefObject'

Если я отключу оптимизированный код, это исчезнет, ​​и все будет хорошо.

0 голосов
/ 22 января 2009

Visual Studio использует функцию IsSilverlightAssembly () в типе Microsoft.VisualStudio.Silverlight.SLUtil, чтобы проверить, может ли быть установлена ​​ссылка.

У Дэвида Бетца есть хороший пост в блоге с описанием деталей здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...