2017-09-11 5 views
3

Il devrait être possible de référencer des bibliothèques de classe d'infrastructure .net à partir de projets .net core 2 dans Visual Studio 2017, mais je reçois une exception d'exécution lors de l'essai de référence une bibliothèque de classes dépendante de System.ServiceModel.target Bibliothèque de classes d'infrastructure .net avec dépendance System.ServiceModel à partir d'une application de base .net

Créer une "application console (.NET Core)". Visual Studio a défini le framework cible sur ".NET Core 2.0".

Créer une "bibliothèque de classes (.Net Framework)". Visual Studio a défini l'infrastructure cible sur ".NET Framework 4.6.1".

Référence "System.ServiceModel 4.0.0.0" de la bibliothèque de classes. Remplissez Class1 dans la bibliothèque de classe avec les éléments suivants:

public class Class1 
{ 
    public void Test() 
    { 
     System.ServiceModel.EndpointAddress address = new System.ServiceModel.EndpointAddress(""); 
    } 
} 

Référence la bibliothèque de classes de l'application de la console. De la principale méthode de l'application de la console appeler la méthode de test dans Class1:

class Program 
{ 
    static void Main(string[] args) 
    { 
     new Class1().Test(); 
    } 
} 

Générez et exécutez. Une exception est levée alors la méthode Test() est essayée exécutée:

System.IO.FileNotFoundException a eu lieu HResult = 0x80070002
message = Impossible de charger le fichier ou l'assembly « System.ServiceModel, Version = 4.0.0.0, Culture = neutre, PublicKeyToken = b77a5c561934e089 '. Le système ne trouve pas le fichier spécifié. Source = StackTrace: à ClassLibrary1.Class1.Test() dans c: \ users \ rth \ source \ repos \ ConsoleApp2 \ ClassLibrary1 \ Class1.cs: ligne 15 à ConsoleApp1.Program.Main (String [] args) dans c: \ users \ RTH \ \ repo source de de \ ConsoleApp2 \ ConsoleApp1 \ Program.cs: ligne 11

System.ServiceModel n'est pas dans le répertoire/bin/Debug soit projet.

J'ai essayé de copier manuellement le fichier System.ServiceModel dans le dossier/bin/debug de l'application console, mais la même erreur s'est produite. Comment faire référence à une bibliothèque de classes qui référence System.ServiceModel sans obtenir d'exceptions d'exécution?

+0

System.ServiceModel se trouve dans le GAC et dans le répertoire Framework, au moins sur ma machine. Vous avez peut-être référencé un assembly avec une exigence de version spécifique que vous ne rencontrez pas. Vérifiez votre GAC et vos répertoires de framework. Ensuite, vérifiez que votre référence n'est pas ciblée en tant que version spécifique. –

+0

@ Kevin-hirst: Lorsque je regarde les propriétés pour la référence à System.ServiceModel, le chemin d'accès est C: \ Program Files (x86) \ Assemblys de référence \ Microsoft \ Framework \ .NETFramework \ v4.6.1 \ System.ServiceModel.dll. Si je prends ce fichier et que je le place sous/bin/debug dans l'application console, cela ne fonctionne toujours pas et le chargeur d'assembly est supposé regarder ici. Une chose à noter: il n'y a pas de problème si je crée un.Net Framework Console App (pas. Net core) et référence la même bibliothèque de classes. – Rolf

+0

Si je change le framework cible de l'application console en .NET Framework 4.6.1 cela fonctionne. – Rolf

Répondre

0

Pour rendre le code ci-dessus travailler sans l'exception:

  1. Mettez à jour votre Class Library (.Net Framework) à Class Library (.NET Standard 2.0)
  2. Ajouter un package NuGet System.ServiceModel.Http (version v4.4.0) à Class Library (.NET Standard 2.0) dépendances.
+0

Oui Les bibliothèques .NET Standard 2.0 peuvent être très bien référencées. J'ai cependant besoin de référencer Sys-tem.ServiceModel version 4.0.0.0 spécifiquement parce que la version 4.4.0 de System.ServiceModel. * Ne contient pas la fonctionnalité dont j'ai besoin: NetTcpSecurity avec SecurityMode.Message et MessageCredentialType.Windows. Désolé de ne pas être clair sur ce point. J'ai ajouté le numéro de version spécifique à la question. – Rolf

+0

@Rolf vous voudrez peut-être vérifier si cette solution de contournement avec 'SimpleSOAPClient' fait l'affaire dont vous avez besoin https://stackoverflow.com/a/45988249/804385 –

+0

Le modèle de service de base est disponible dans' System.ServiceModel.Primitives' NuGet package, qui est compatible avec .NET Standard 2.0 –