RegAm: Método 'LoadContent' em Type 'Myalgorithms.myalgorithm' da Assembly 'A' não tem uma implementação

StackOverflow https://stackoverflow.com/questions/4606246

Pergunta

Eu tenho os seguintes tipos (consulte a peça do código abaixo). É compilado, mas o RegaMm dá o seguinte erro: "Método 'LoadContent' no tipo 'Myalgorithms.myalgorithm' da Assembly 'A' não tem uma implementação. "

Tem alguma ideia do porquê? Se eu não implementasse o método loadContent (), ele não seria compilado.

Eu vi uma pergunta quase a mesma, aqui:TypeLoadexception diz 'sem implementação', mas é implementadoMas não ajudou, porque:

Os projetos A, B e C estão na mesma solução, e a ordem de construção é C, B e A.

"Linha de comando de eventos pós-construção" de todos os projetos contém as próximas linhas:

"C: Windows Microsoft.net Framework V2.0.50727 regasm.exe" /u $ (TargetPath)
"C: Windows Microsoft.net Framework V2.0.50727 regasm.exe" $ (TargetPath)
"C: Arquivos de Programas Microsoft SDKS Windows V6.0a bin gacutil.exe" /u $ (TargetName)
"C: Arquivos de Programas Microsoft SDKS Windows V6.0a bin gacutil.exe" /se $ (TargetPath)

Então, acho que o Projeto A se refere aos conjuntos certos.

E por que resolve o problema se eu adicionei à classe MyalGorithMbase na próxima:

substituição protegida void loadcontent (leitor PersistenceReader) {}

Obrigado!

Kate

// C.dll from project C
namespace Microsoft.SqlServer.DataMining.PluginAlgorithms
{
 public abstract class AlgorithmBase : IDisposable
 {
  //....
  protected abstract void LoadContent(PersistenceReader reader);
 }
}

//in B.dll from project B, refers C.dll
namespace AlgorithmCommons
{
 public abstract class MyAlgorithmBase : AlgorithmBase
 {
  //....
  // Why solves the problem if the next line is commented out?
  // protected override void LoadContent(PersistenceReader reader) { }
 }
}

//in A.dll from project A, refers B.dll and C.dll

namespace MyAlgorithms
{
 public class MyAlgorithm : MyAlgorithmBase
 {
  protected override void LoadContent(PersistenceReader reader)
  {
  //....
  }
 }
}
Foi útil?

Solução

O compilador verifica isso. O que quase certamente significa que, em tempo de execução, quando o Regam.exe carrega a montagem, ele não carrega a montagem que você acha que sim. Há muitas oportunidades para isso, pois você usa o GAC. Que pode produzir uma versão antiga de um conjunto dependente, com base em um número [AssemblyVersion] no conjunto de referência.

Solucione isso com fuslogvw.exe, registre todas as ligações. Isso mostra de onde vinha toda montagem.

Fique fora desse tipo de problema por não Colocando suas montagens no GAC. É um detalhe de implantação e não é apropriado em sua máquina de desenvolvimento, onde as versões de montagem podem mudar rapidamente, especialmente quando você deixa o sistema de construção incrementá -las automaticamente. Você faz isso usando a opção /codebase para regasm.exe

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top