Como o Silverlight determinar uma assembléia é “Silverlight”?
-
04-07-2019 - |
Pergunta
Estou tentando compilar o código de F # para uso em Silverlight. Eu compilar com:
- noframework --cliroot "C: \ Program Files \ Microsoft Silverlight \ 2.0.31005.0" --standalone
Isso gera um autônomo de montagem que faz referência ao quadro SL. Mas quando eu tento adicionar uma referência para o gerado montagem, eu recebo este erro:
Você só pode adicionar referências de projeto para outros projetos do Silverlight no solução.
O que é o VS plug-in fazendo para determinar que este não é um Silverlight montagem? Aqui está o manifesto:
// 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
Eu não entendo o que ele está achando que ele não gosta; é IL verificável puro. I comparado a um SL "biblioteca de classes" de montagem, e parece o mesmo. A única diferença era alguns atributos, mas eu apaguei esses e VS ainda deixe-me fazer referência a DLL. Eu ainda acrescentou IL unverifiable à "biblioteca SL" DLL e ainda carregado.
Todas as sugestões?
Atualização: Já fiz alguns picar ao redor, e isso não parece ser o manifesto que importa. Ele não gosta de algo no IL das bibliotecas FSharp. Eles são peverifiable, mas algo ali está a provocar a rejeição.
Solução
Resposta!
Aparentemente, o problema é que quando você adiciona uma referência para o bin \ Release ou bin \ Debug, Visual Studio (ou o sistema de projeto Silverlight) decide tentar fazer referência ao projeto. Esta falha por qualquer motivo.
Se você copiar o DLL # saída F para outro local, então a referência passa bem. (Esta será uma referência de arquivo, e não uma referência de projeto, é claro.)
Em seguida, dependências de configuração para que o # biblioteca F constrói em primeiro lugar, então você pode usar uma referência de arquivo para obter o F # -generated binário.
Atualização: Uma questão mais aparente. Se eu virar código otimizar, então eu recebo este erro:
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'
Se eu continuar código otimizado fora, este vai embora e tudo funciona bem.
Outras dicas
Visual Studio usa a função IsSilverlightAssembly () no tipo Microsoft.VisualStudio.Silverlight.SLUtil para verificar se uma referência pode ser definido.
David Betz tem um bom post que descreve os detalhes aqui .