Как Silverlight определяет сборку "Silverlight"?
Я пытаюсь скомпилировать код из 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 "class library", и она выглядит одинаково. Единственное различие заключалось в некоторых атрибутах, но я удалил те, и VS все еще позволяет мне ссылаться на DLL. Я даже добавил не проверяемый IL в DLL библиотеки SL, и он все еще загружен.
Любые предложения?
Обновление: я сделал несколько ковычек, и, похоже, это не так. Это не нравится в IL из библиотек FSharp. Они проницаемы, но что-то там вызывает отторжение.
Ответы
Ответ 1
Ответ
Очевидно, проблема заключается в том, что при добавлении ссылки на 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'
Если я сохраню оптимизированный код, это исчезнет, и все будет хорошо.
Ответ 2
Visual Studio использует функцию IsSilverlightAssembly() в типе Microsoft.VisualStudio.Silverlight.SLUtil, чтобы проверить, можно ли установить ссылку.
Дэвид Бетц имеет приятное сообщение в блоге, описывающее подробности здесь.