À l'aide de 2 versions différentes de la même dll?

J'ai reçu 2 pré-compilé dll:

Common.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f3b12eb6de839f43, processorArchitecture=MSIL

Common.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f3b12eb6de839f43, processorArchitecture=MSIL

Exemple des différences dans l'API:

À l'aide de 2 versions différentes de la même dll?

Et je suis en train de charger les deux en un seul projet de faire quelque chose comme ceci:

extern alias v10;
extern alias v20;

private static void UpgradeUser()
{
    //Load old user
    var userOld = new v10::Common.Data.UserData();
    userOld.loadData("user.dat");

    //Create new user
    var userNew = new v20::Common.Data.UserData();

    //Copy properties  
    userNew.FirstName = userOld._firstName;
    userNew.LastName = userOld._lastName;
    userNew.Age = userOld._age;

    //Invoke method from v10 and v20 API
    userOld.version();
    userNew.DisplayVersion();

    if (userNew.GetUserInfo() != userOld.getInfo())
    {
        throw new Exception("Discrepencies in upgrade ");
    }

    Console.WriteLine("Upgrade done!");
}

J'ai mis en place mon projet références et app.config à la suivante. Je suis également copier la dll dans mon dossier de sortie, correspondant à la appconfig hrefs

<!-- [Edited: see history for previous version] -->
<Reference Include="Common.Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f3b12eb6de839f43, processorArchitecture=MSIL">
  <HintPath>libs\Common.Data.1_0_0_0.dll</HintPath>
  <Aliases>v10</Aliases>
</Reference>

<Reference Include="Common.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f3b12eb6de839f43, processorArchitecture=MSIL">
  <HintPath>libs\Common.Data.2_0_0_0.dll</HintPath>
  <Aliases>v20</Aliases>
</Reference>

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Common.Data" publicKeyToken="f3b12eb6de839f43" culture="neutral" />
      <codeBase version="1.0.0.0" href="libs\Common.Data.1_0_0_0.dll" />
      <codeBase version="2.0.0.0" href="libs\Common.Data.2_0_0_0.dll" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

J'ai obtenu dans la mesure où pour construire avec succès.

Mais quand j'essaie de le lancer, j'obtiens un MissingMethodException pour UserData.loadData.

À l'aide de 2 versions différentes de la même dll?

J'ai été par le biais de multiples stackoverflow postes, msdn et codeproject articles, mais n'arrive pas à le faire fonctionner.

Lien 1,
Lien 2,
Lien 3,
Lien 4

Pense que je vais manquer une étape importante, mais ne peut pas comprendre ce qui, et pourrait utiliser un peu d'aide.

[Edit1]

J'ai essayé d'utiliser la dll séparément, et ils travaillent. (A enlevé le désordre. Voir l'historique des versions pour les captures d'écran)

[Edit2]

J'ai essayé de Mukesh Kumar proposition, et changé mon application.config:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Common.Data" 
                        publicKeyToken="f3b12eb6de839f43" 
                        culture="neutral" />
      <bindingRedirect oldVersion="1.0.0.0"
                       newVersion="2.0.0.0"/>
    </dependentAssembly>
  </assemblyBinding>
</runtime>

Mais il ne fonctionne toujours pas. Je suis maintenant FileNotFoundException.

[Edit3]

Ok, je suis presque certain que le <bindingRedirect> n'est pas correct, et devrait être <codeBase> à la place.

J'ai essayé de compiler à partir de la CLI:

csc Program.cs /reference:v10=libs/Common.Data.1_0_0_0.dll /reference:v20=libs/Common.Data.2_0_0_0.dll

Et il fonctionne très bien. J'ai été en mesure d'utiliser les deux Api en même temps:

À l'aide de 2 versions différentes de la même dll?

Mais quand j'essaie de le construire à partir de Visual Studio, il se plaint de référence, même si je l'ai déjà précisé, l'alias de référence:

The extern alias 'v10' was not specified in a /reference option

J'ai essayé de modifier <Reference /> pour inclure/exclure <SpecificVersion>True</SpecificVersion> avec aucun effet.

J'ai trouvé ce post, où la solution a été de supprimer et de rajouter les chemins. À l'aide de cette solution, Visual Studio génère bien, mais je suis de retour à System.MissingMethodException.

Se sent comme je l'ai presque eu, mais pas tout à fait. Comment puis-je obtenir Visual Studio pour générer correctement?

[Edit4]

J'ai essayé de miguel méthode, mais toujours pas de travail.

Dans cette tentative, j'ai renommé les fichiers dll leur nom d'origine, et de les stocker dans des dossiers différents à la place.

À l'aide de 2 versions différentes de la même dll?

J'ai ensuite mis à jour app.config pour faire un bindingRedirect ainsi que la base de code.

Lors de l'exécution, je m'y MissingMethodException.

Je n'étais pas sûr de ce que 4- Find the and put in False dire, donc j'ai essayé toutes les combinaisons de <Private>, <SpecificVersion>, ainsi que la mise en <Reference Include> à la FQNs, mais aucune de ces combinaisons de travail.

En regardant mon 3ème édition, j'ai réussi à compiler et exécuter l'exemple réussi (avec mon renommé dll + app.config de la base de code hrefs) quand fait via la CLI.

Mon problème est maintenant, comment dois-je configurer mon csproj, de sorte qu'il crée le même.

pouvez-vous s'il vous plaît poster la StackTrace?
Vous pouvez essayer de retirer le <runtime> section de votre config (vous ne devriez pas en avoir besoin) et en ajoutant les global alias pour vos assemblées. Vous ne savez pas si cela fera une différence, mais je le fais tout le temps sans problèmes et j'ai toujours l'espace de noms global ajoutée, comme "global,v10".
La raison, la méthode n'est pas trouvé, parce que c'est probablement d'essayer d'utiliser le mauvais assemblage. Pourquoi est - loadData et Common.Data.UserDa.. surlignée en rouge? c'est un resharper erreur de droit? que faut-il dire?
oui, c'est un resharper erreur Cannot resolve symbol 'loadData', bien que VS construit avec succès. Les dll ont été renommés, c'est pourquoi j'ai ajouté le runtime élément appconfig. Sans elle, je vais avoir un FileNotFoundException - Could not load file or assembly 'Common.Data...
Étrange. Peut-être que vous pourriez essayer de l'importer le fichier DLL que vous appelez de main sous son nom normal dans le même dossier que l'exécutable, ou de la compilation de votre propre paire de Dll afin de vérifier si il n'y a pas un problème dans les bibliothèques.

OriginalL'auteur jayars | 2017-03-10