RegAsm:Metodo LoadContent' nel tipo 'MyAlgorithms.MyAlgorithm' dall'assemblea " A " non avere un'implementazione

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

Domanda

Ho i seguenti tipi(vedi codice sotto).Viene compilato ma RegAsm dà il seguente errore:"Metodo LoadContent' nel tipo di 'MyAlgorithms.MyAlgorithm' dall'assemblea " A " non avere un'implementazione."

Ha qualche idea del perché?Se io non implementato LoadContent() il metodo non essere compilato.

Ho visto un quasi la stessa domanda qui:TypeLoadException dice 'no attuazione', ma è implementato ma non è di aiuto, perché:

A, B e C sono i progetti che la stessa soluzione, e l'ordine di generazione è C, B e A.

"Evento di Post-compilazione da riga di comando" di tutti i progetti contiene le linee seguenti:

"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 egAsm.exe" /u $(TargetPath)
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 egAsm.exe" $(TargetPath)
"c:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\gacutil.exe" /u $(TargetName)
"c:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\gacutil.exe" /se $(TargetPath)

Quindi penso che Un progetto si riferisce a destra assemblee.

E perché risolve il problema se ho aggiunto alla MyAlgorithmBase classe successiva:

protected override void LoadContent(PersistenceReader reader) { }

Grazie!

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)
  {
  //....
  }
 }
}
È stato utile?

Soluzione

Il compilatore verifica questo.Che vuol dire quasi sicuramente che in fase di runtime, quando Regasm.exe carichi l'assemblea, non caricare l'assembly si pensi.C'è un sacco di opportunità per questo dal momento che si utilizza il GAC.In grado di produrre una vecchia versione di un assembly dipendente, basato su un [AssemblyVersion] numero di riferimento dell'assemblea.

La risoluzione di questo con Fuslogvw.exe, log di tutta la lega.Vi mostra dove ogni assemblea è venuto da.

Rimanere fuori di questo tipo di problemi non mettere gli assembly nella global assembly cache.Si tratta di una distribuzione di dettaglio e non appropriata sul vostro dev macchina dove assemblea versioni possono cambiare rapidamente, soprattutto quando si lascia che il sistema di generazione automaticamente l'incremento di loro.È possibile farlo utilizzando l'opzione /codebase per Regasm.exe

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top