2016-01-14 19 views
6

Volevo utilizzare due diverse versioni della stessa libreria (OpenCVSharp 2.xe OpenCVSharp 3.x) Bene, ho scaricato questi due pacchetti entrambi nel progetto separato (chiamiamolo OCV2Wrapper e OCV3Wrapper) e fanno riferimento a entrambi i wrapper nel mio progetto. Ho dovuto rinominare le librerie da un pacchetto (2.x) e fare riferimento ad esse manualmente perché: Can we add 2 different versions of same package in NuGet. Ho letto degli alias esterni e ho usato un alias esterno in uno dei wrapper (2.x nel mio caso). Ma ho alcuni problemi principali:Utilizzo di due diverse versioni dello stesso pacchetto di nuget

  • mie librerie rinominate non vengono copiati nella costruzione del progetto di lancio (quella che fanno riferimento entrambi i wrapper), ma è nella build del 2.x involucro
  • E non funzionano perché ancora non è possibile trovare il tipo dal mio wrapper 2.x anche quando copio manualmente le mie librerie rinominate da 2.x wrapper.

Qual è l'approccio corretto per questo scenario in C#?

Voglio utilizzare entrambi i wrapper in soluzione perché la versione 2.x contiene algoritmi (SIFT e SURF) e 3.x versione contiene algoritmi (Kaze e AKaze). Posso vivere che entrambi i pacchetti sarebbero fuori da nuget ma preferisco che 3.x sia di nuget e la versione 2.x sia configurata manualmente.

+0

Hai affermato di aver creato almeno tre progetti nella soluzione, corretto? La limitazione della domanda che hai postato è per un progetto.È possibile aggiungere diverse versioni di un pacchetto nuget a diversi progetti senza alcun problema. E fintanto che i tuoi due progetti gestiscono il codice del pacchetto nuget e fai riferimento ai due nel tuo terzo progetto, tutto andrebbe bene –

+1

OK, capisco. MA quando lo faccio (uso due wrapper per due diverse librerie) quindi nella mia build di programma eseguibile non ho librerie da 2.x wrapper (che sono referenziate manualmente da browse e rinominate in modo da evitare conflitti di sovrascrittura del nome) – LightCZ

+0

Confermato il comportamento, anche io non vedo Nuget ottenere automaticamente la libreria versione inferiore –

risposta

0

OK, risolvolo scaricando l'intero codice sorgente per la versione 2.X del wrapper. Rinominato il suo spazio dei nomi in ABCDEF2 dove ABCDEF era lo spazio dei nomi originale. Costruisci il mio pacchetto nuget con la mia chiave e ... pubblicalo sul nostro server privato di nuget. Questa è una soluzione così scarsa, ma non c'è altro modo che scaricare manualmente i pacchetti originali e fare riferimento direttamente con un diverso nome file ecc. E perdere i vantaggi di nuget.

5

Come già affermato, non vi è nulla di sbagliato nel fare riferimento a 2 versioni diverse di un pacchetto nugget, purché nei diversi progetti di Visual Studio vengano creati tali riferimenti.

Ma questo è anche il punto in cui finisce la parte facile, ma penso ci siano alcune opzioni. A seconda delle esigenze, vedo le seguenti opzioni.

  1. Creare una fase di creazione post che registra gli assembly con versione multi in GAC. Finché ogni assemblaggio ha una diversa versione di assemblaggio, il CLR preleverà il giusto assieme dal GAC quando necessario.
  2. Creare una fase di post di compilazione che copia i diversi gruppi in una sottocartella di voi cartella bin un'applicazione come bin/package-v1 e bin/package-v2. Quindi, nella tua applicazione puoi ignorare l'evento AssemblyResolve come descritto qui https://msdn.microsoft.com/en-us/library/ff527268(v=vs.110).aspx. Ciò consentirà di caricare l'assieme nella versione corretta al momento del bisogno.
  3. Se non si vuole giocare con AssemblyResolve, allora si può anche modificare il vostro web/app.config fare assemblaggio reindirizzare/sondare come descritto qui https://msdn.microsoft.com/en-us/library/4191fzwb(v=vs.110).aspx

Spero che questo aiuti un bit, quindi non è necessario modificare il codice sorgente di terze parti la volta successiva.

Problemi correlati