6

To pytanie mogło zostać zadane wiele razy, a może po prostu nie mogę korzystać z funkcji wyszukiwania, tak samo jak Google, ale na razie nie znalazłem odpowiedzi na to pytanie.Odwoływana biblioteka DLL nie jest kopiowana do projektu odwoływania się

Ja obecnie mam dwa projekty, projekt X, Y i projekt projekt oo (która tylko trzyma mapowania)

Project X to FluentNhibernate projekt, który posiada swoje sessionfactories i takie rzeczy. To jest także miejsce, w którym mapowania są załadowane i rzeczy (jest to ważne i podejrzewam, że to może być cały problem). SqlServer.Types.dll.

Projekt Y to usługa wykorzystująca projekt X do połączeń z bazą danych.

Wszystkie konstrukcje probems znajdują i działają idealnie na mojej maszynie programistycznej, jednak po wdrożeniu na naszym serwerze nie działają (błędy w czasie wykonywania). Błąd był dość niejasny, ponieważ wskazywał na brakujące połączenie FluentNHibernate, co nie miało miejsca.

Procmon.exe na szczęście pokazał kod próbujący załadować plik Microsoft.SqlServer.Types.dll, który od czasu, gdy serwer nie ma zainstalowanego programu SQL Server (mój klient też nie ma, ale ma studio zarządzania, które najprawdopodobniej instaluje to .DLL również).

Jak na razie dobrze, skopiowałem bibliotekę DLL i zadziałało (tak!).

Teraz pomyślałem, że dodam zespół do projektu X, aby upewnić się, że to odniesienie zostanie skopiowane do innych projektów przy użyciu projektu X. To się nie stało ... Więc próbowałem ustawić "Kopiuj lokalnie" ustawienie na true.

Niestety to jeszcze nie kopiuje .dll do Y. projektu odsyłania

Czy istnieje sposób, aby tak się stało, czy jest to Visual Studio beeing mądry i realizacji Projektu Y nie trzeba tego .dll i w ten sposób odmawiając skopiowania?

(Od Projektu Z potrzebuje rzeczywistego odniesienia i Project X ładuje ten czas montażu @ run nie jest „twarde” odniesienia między Z i X)

Could każdy geniusz Stackoverflow rzucić nieco światła na to, ponieważ szczerze mówiąc” Chciałbym wiedzieć, dlaczego zachowuje się w ten sposób (i najlepiej sposób, aby zachowywał się tak, jakbym tego chciał).

Odpowiedz

1

Teraz pomyślałem, że dodam zespół do projektu X, aby upewnić się, że to odniesienie zostanie skopiowane do innych projektów przy użyciu projektu X. To się nie stało ... Tak więc próbowałem ustawić "Kopiuj lokalnie "ustawienie na true.

Nadal mówisz o Microsoft.SqlServer.Types.dll prawda?

Miałem te same problemy jakiś czas temu, faktycznie typy sqlserver nie powinny być kopiowane i redystrybuowane z twoją instalacją. Prawidłowym sposobem "instalacji" jest pobranie środowiska uruchomieniowego serwera sql (zawartego w narzędziach do zarządzania serwerem sql, dlatego działa on lokalnie).

Ponieważ jest jakiś czas temu, nie jestem w 100% pewien, czy poniższe informacje są poprawne i będą działać, ale po prostu spróbuj zainstalować tylko Microsoft® System CLR Types for Microsoft® SQL Server® 2012. Na tej stronie pobierania rozwiń Instrukcje instalacji i przewiń w dół do pobierania typów CLR ...

Zastosowanie this link for SQL Server 2008

zainstalować to na serwerze docelowym. Spowoduje to tylko zainstalowanie rzeczy potrzebnych do uruchomienia tego typu dll ...

+0

ja wciąż mówimy o Microsoft.SqlServer.Types.dll tak. Ale dlaczego dystrybucja z twoim rzeczywistym oprogramowaniem byłaby w tym przypadku zła? Czy jest tu jakaś najlepsza praktyka? –

+0

Dll typu jest tylko wrapper wokół bibliotek dll, które są również używane przez SQL Server się do wykonywania operacji przestrzennych ... te biblioteki DLL są napisane w C/C++ i nie są kopiowane, jeśli po prostu skopiować ponad dll typy ... możesz również skopiować program SQLServerSpatial.dll (który jest rodzimą biblioteką dll) – MichaC

+0

Dobrze używam tych typów w kodzie źródłowym napisanym przez jedną trzecią, którą zmieniłem, by używać płynnego nhibernate z informacjami geo i serwerem SQL 2012 Dialect. Jednak instalowanie typów CLR według podanych informacji wydaje się działać. Więc zrobię jeszcze kilka testów i jeśli ci się uda, zaznaczę twoją odpowiedź. Powiedział, że wątpię, by studio graficzne odmówiło kopiowania bibliotek DLL, ponieważ zostały napisane w języku C/C++. Podstawowy problem nadal istnieje i chciałbym odpowiedź tutaj, jednak inni, którzy znajdują tu drogę z powodu Microsoft.SqlServer.Types.dll powinni użyć instalatora. –

7

Na to pytanie już udzielono odpowiedzi, ale doszedłem do wniosku, że dołączę ogólną bezpieczną metodę kopiowania wszystkich pośrednich odniesień do katalogów wyjściowych projektów.

  1. Set Kopia lokalna do prawda dla wszystkich odniesień chcesz być dołączone do wyjścia.
  2. Zapisz kopię kodu zależności pośrednich (patrz poniżej) w pliku o nazwie CopyIndirectDependencies.targets i umieść plik celów w katalogu projektu.
  3. Edytuj swój .csproj lub .vbproj, aby dołączyć import do dodanego pliku .targets. Zobacz przykład poniżej.
  4. Zbuduj swój projekt i powinieneś mieć automatycznie pobrane zależności wtórne do wyjścia kompilacji.

CopyIndirectDependencies.targets zawartości pliku projektu

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <CopyIndirectDependencies 
     Condition="'$(CopyIndirectDependencies)'==''">true</CopyIndirectDependencies> 
    <CopyIndirectDependenciesPdb 
     Condition="'$(CopyIndirectDependenciesPdb)'==''">false</CopyIndirectDependenciesPdb> 
    <CopyIndirectDependenciesXml 
     Condition="'$(CopyIndirectDependenciesXml)'==''">false</CopyIndirectDependenciesXml> 
    </PropertyGroup> 


    <!-- BuildXxx part --> 

    <Target Name="CopyIndirectDependencies" 
      Condition="'$(CopyIndirectDependencies)'=='true'" 
      DependsOnTargets="DetectIndirectDependencies"> 
    <Copy Condition="'%(IndirectDependency.FullPath)'!=''" 
      SourceFiles="%(IndirectDependency.FullPath)" 
      DestinationFolder="$(OutputPath)" 
      SkipUnchangedFiles="true" > 
     <Output TaskParameter="CopiedFiles" 
       ItemName="IndirectDependencyCopied" /> 
    </Copy> 
    <Message Importance="low" 
      Condition="'%(IndirectDependencyCopied.FullPath)'!='' 
       and '%(IndirectDependencyCopied.Extension)'!='.pdb' 
       and '%(IndirectDependencyCopied.Extension)'!='.xml'" 
      Text="Indirect dependency copied: %(IndirectDependencyCopied.FullPath)" /> 
    </Target> 

    <Target Name="DetectIndirectDependencies" 
      DependsOnTargets="ResolveAssemblyReferences"> 

    <Message Importance="low" 
      Text="Direct dependency: %(ReferencePath.Filename)%(ReferencePath.Extension)" /> 
    <Message Importance="low" 
      Text="Indirect dependency: %(ReferenceDependencyPaths.Filename)%(ReferenceDependencyPaths.Extension)" /> 

    <!-- Creating indirect dependency list --> 
    <CreateItem Include="%(ReferenceDependencyPaths.FullPath)" 
       Condition="'%(ReferenceDependencyPaths.CopyLocal)'=='true'"> 
     <Output TaskParameter="Include" 
       ItemName="_IndirectDependency"/> 
    </CreateItem> 
    <CreateItem Include="%(ReferenceDependencyPaths.RootDir)%(ReferenceDependencyPaths.Directory)%(ReferenceDependencyPaths.Filename).xml" 
       Condition="'%(ReferenceDependencyPaths.CopyLocal)'=='true' and '$(CopyIndirectDependenciesXml)'=='true'"> 
     <Output TaskParameter="Include" 
       ItemName="_IndirectDependency"/> 
    </CreateItem> 
    <CreateItem Include="%(ReferenceDependencyPaths.RootDir)%(ReferenceDependencyPaths.Directory)%(ReferenceDependencyPaths.Filename).pdb" 
       Condition="'%(ReferenceDependencyPaths.CopyLocal)'=='true' and '$(CopyIndirectDependenciesPdb)'=='true'"> 
     <Output TaskParameter="Include" 
       ItemName="_IndirectDependency"/> 
    </CreateItem> 

    <!-- Filtering indirect dependency list by existence --> 
    <CreateItem Include="%(_IndirectDependency.FullPath)" 
       Condition="Exists('%(_IndirectDependency.FullPath)')"> 
     <Output TaskParameter="Include" 
       ItemName="IndirectDependency"/> 
    </CreateItem> 

    <!-- Creating copied indirect dependency list --> 
    <CreateItem Include="@(_IndirectDependency->'$(OutputPath)%(Filename)%(Extension)')"> 
     <Output TaskParameter="Include" 
       ItemName="_ExistingIndirectDependency"/> 
    </CreateItem> 

    <!-- Filtering copied indirect dependency list by existence --> 
    <CreateItem Include="%(_ExistingIndirectDependency.FullPath)" 
       Condition="Exists('%(_ExistingIndirectDependency.FullPath)')"> 
     <Output TaskParameter="Include" 
       ItemName="ExistingIndirectDependency"/> 
    </CreateItem> 

    </Target> 


    <!-- Build sequence modification --> 

    <PropertyGroup> 
    <CoreBuildDependsOn> 
     $(CoreBuildDependsOn); 
     CopyIndirectDependencies 
    </CoreBuildDependsOn> 
    </PropertyGroup> 
</Project> 

próbki z importu

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    ... 

    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
    <Import Project="CopyIndirectDependencies.targets" /> <!-- ADD THIS LINE!! --> 

    ... 

</Project> 

Źródło:http://blog.alexyakunin.com/2009/09/making-msbuild-visual-studio-to.html

+0

Czy ma znaczenie, gdzie wiersz w kroku 3 został dodany w pliku projektu? Na przykład, czy musi być pod celem AfterBuild lub gdzieś indziej (lub gdziekolwiek)? – longda

+4

Hmm, to nie działa w Visual Studio 2012. Mam nadzieję, że się mylę. – longda

+0

@longda: Zobacz artykuł, z którego pozyskałem tę odpowiedź. Ma przykładowy projekt. –

Powiązane problemy