RegAsm: « LoadContent » Procédé type « MyAlgorithms.MyAlgorithm » ensemble de « A » n'a pas une mise en œuvre

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

Question

Je les types suivants (voir la partie de code ci-dessous). Il est compilé mais RegAsm donne l'erreur suivante: «La méthode « LoadContent » en caractères « MyAlgorithms.MyAlgorithm » de l'assemblage « A » ne dispose pas d'une mise en œuvre »

a une idée pourquoi? Si je ne mis en œuvre la méthode de LoadContent () il ne serait pas compilé.

Je vis un presque même question, ici: TypeLoadException dit « non mise en œuvre », mais il est mis en œuvre mais il n'a pas aidé, parce que:

A, projets B et C sont dans la même solution, et l'ordre de génération est C, B et A.

« commande de l'événement après génération » de tous les projets contient les lignes suivantes:

"C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ RegAsm.exe" / u $ (TargetPath) "C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ RegAsm.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" / if $ (TargetPath)

Je pense donc que le projet A fait référence aux ensembles droit.

Et pourquoi résout le problème si j'ajouté à la classe MyAlgorithmBase suivant:

LoadContent protected override void (lecteur PersistenceReader) {}

Merci!

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)
  {
  //....
  }
 }
}
Était-ce utile?

La solution

Le compilateur vérifie cela. Ce qui signifie presque sûrement que lors de l'exécution, lorsque Regasm.exe charge l'ensemble, il ne charge pas l'assemblage que vous pensez. Il y a beaucoup de possibilités pour cela car vous utilisez le GAC. Ce qui peut produire une ancienne version d'un assemblage à charge, sur la base d'un nombre [AssemblyVersion] dans l'ensemble de référence.

avec résolvez ce Fuslogvw.exe, connectez-vous tous les binds. Il vous montre où chaque assemblée est venue.

Restez en dehors de ce genre de problème par pas mettre vos assemblées dans le GAC. Il est un détail de déploiement et non approprié sur votre machine dev où les versions de montage peuvent changer rapidement, en particulier lorsque vous laissez le système de construction incrémenter automatiquement. Vous le faites en utilisant l'option / codebase pour Regasm.exe

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top