6

संदर्भित करने के लिए संदर्भित डीएलएल की प्रतिलिपि नहीं बनाई जा रही है। इस प्रश्न से कई बार पूछा जा सकता है और शायद मैं यहां Google के रूप में खोज कार्यों का उपयोग करने में भी बुरा हूं लेकिन मुझे अभी तक इस प्रश्न का उत्तर नहीं मिला है।प्रोजेक्ट

मैं वर्तमान में दो परियोजनाओं, परियोजना एक्स, वाई और परियोजना परियोजना जेड (जो केवल मैपिंग रखती है)

परियोजना एक्स एक FluentNhibernate परियोजना जो इस तरह मेरे sessionfactories और चीजों को धारण करता है मिल गया है। तो यह भी है जहां मैपिंग लोड हो जाते हैं और चीजें (यह महत्वपूर्ण है और मुझे संदेह है कि यह मेरी समस्या का पूरा कारण हो सकता है)

अब प्रोजेक्ट एक्स में मैंने माइक्रोसॉफ्ट का उपयोग करने वाली एक असेंबली का संदर्भ दिया है। SqlServer.Types.dll।

प्रोजेक्ट वाई एक ऐसी सेवा है जो इसके डेटाबेस कनेक्शन के लिए प्रोजेक्ट एक्स का उपयोग करती है।

सभी संभावनाएं मेरी विकास मशीन पर पूरी तरह से ढूंढें और चलाएं, हालांकि हमारे सर्वर पर तैनात होने पर वे कार्य करने में विफल रहे (रनटाइम त्रुटियां)। त्रुटि बहुत अस्पष्ट थी क्योंकि यह एक लापता FluentNHibernate असेंबली की ओर इशारा किया जो मामला नहीं था।

Procmon.exe सौभाग्य से Microsoft.SqlServer.Types.dll को लोड करने का प्रयास करने वाला कोड दिखाता है, क्योंकि सर्वर के पास SQL ​​सर्वर स्थापित नहीं है (मेरा क्लाइंट या तो नहीं है लेकिन इसमें एक प्रबंधन स्टूडियो है जो अधिकतर इसे इंस्टॉल करता है डीएलएल भी)।

अब तक इतना अच्छा है, डीएलएल की प्रतिलिपि बनाई और यह काम किया (याय!)।

अब मुझे लगा कि मैं प्रोजेक्ट एक्स का उपयोग करके अन्य परियोजनाओं में इस संदर्भ की प्रतिलिपि बनाने के लिए प्रोजेक्ट एक्स में असेंबली जोड़ूंगा। ऐसा नहीं हुआ .... इसलिए मैंने 'कॉपी कॉपी लोकल' सेट करने की कोशिश की। सच करने के लिए सेटिंग।

दुर्भाग्य से यह अभी भी संदर्भित परियोजना वाई

को .dll नकल नहीं करता है वहाँ ऐसा करने के लिए एक रास्ता है या यह दृश्य स्टूडियो चालाक beeing और परियोजना वाई साकार इस .dll की जरूरत नहीं है और है इस प्रकार इसे कॉपी करने से इंकार कर दिया?

(के बाद से परियोजना जेड वास्तविक संदर्भ की जरूरत है और परियोजना एक्स भार इस विधानसभा @ रन टाइम वहाँ जेड और एक्स के बीच 'कठिन' संदर्भ नहीं है)

सकता है किसी भी Stackoverflow प्रतिभा कुछ प्रकाश इस पर ईमानदारी से मैं के बाद से शेड मुझे यह जानना अच्छा लगता है कि यह इस तरह से क्यों व्यवहार कर रहा है (और आदर्श रूप से ऐसा व्यवहार करने का एक तरीका है जैसा मैं चाहता हूं)।

उत्तर

1

अब मुझे लगा कि मैं प्रोजेक्ट एक्स का उपयोग करके अन्य परियोजनाओं में इस संदर्भ की प्रतिलिपि बनाने के लिए प्रोजेक्ट एक्स में असेंबली जोड़ूंगा। ऐसा नहीं हुआ .... इसलिए मैंने 'कॉपी स्थानीय' 'सच करने के लिए सेटिंग।

आप अभी भी माइक्रोसॉफ्ट.SqlServer.Types.dll के बारे में बात कर रहे हैं?

मुझे कुछ समय पहले एक ही समस्या थी, वास्तव में sqlserver प्रकारों की प्रतिलिपि नहीं बनाई जानी चाहिए और आपके इंस्टॉलेशन के साथ पुनर्वितरित नहीं किया जाना चाहिए। "इंस्टॉल" करने का सही तरीका यह एसक्यूएल सर्वर रनटाइम डाउनलोड कर रहा है (जो एसक्यूएल सर्वर प्रबंधन उपकरण में शामिल है, यही कारण है कि यह आपके लिए स्थानीय रूप से काम करता है)।

क्योंकि यह कुछ समय पहले है, यदि मैं निम्न जानकारी सही है और काम करूंगा, तो मुझे 100% निश्चित नहीं है, लेकिन केवल Microsoft® System CLR Types for Microsoft® SQL Server® 2012 को स्थापित करने का प्रयास करें। इस डाउनलोड पेज पर निर्देश स्थापित करें और सीएलआर प्रकार डाउनलोड करने के लिए नीचे स्क्रॉल करें ...

उपयोग this link for SQL Server 2008

लक्ष्य सर्वर पर इस को स्थापित करें। यह केवल इस प्रकार के डीएल चलाने के लिए आवश्यक सामान स्थापित करेगा ...

+0

मैं अभी भी Microsoft.SqlServer.Types.dll के बारे में बात कर रहा हूँ हाँ। लेकिन इस मामले में आपके वास्तविक सॉफ्टवेयर के साथ इसे वितरित क्यों करना बुरा होगा? क्या यहां काम पर कुछ बेहतरीन अभ्यास चीज है? –

+0

प्रकार डीएलएल सिर्फ डीएलएस के चारों ओर एक रैपर है जो एसक्यूएल सर्वर द्वारा स्थानिक ऑपरेशन करने के लिए भी उपयोग किया जाता है ... उन डीएलएस सी/सी ++ में लिखे गए हैं और यदि आप सिर्फ प्रकार के डीएलएल पर प्रतिलिपि बनाते हैं तो कॉपी नहीं किए जाते हैं ... आप कारण भी SQLServerSpatial.dll (जो देशी डीएल है) की प्रतिलिपि बना सकते हैं – MichaC

+0

ठीक है, मैं इन प्रकारों का उपयोग तीसरे स्थान पर लिखे गए स्रोत कोड में कर रहा हूं जिसे मैंने भौगोलिक जानकारी और एसक्यूएल सर्वर 2012 बोली के साथ धाराप्रवाह निबर्ननेट का उपयोग करने के लिए बदल दिया है। आपके द्वारा प्रदान की गई जानकारी के अनुसार सीएलआर प्रकारों को स्थापित करना हालांकि काम करता है। तो मैं कुछ और परीक्षण करूंगा और यदि सफल होते हैं तो मैं आपका जवाब चिह्नित करूंगा। मैंने कहा कि मुझे संदेह है कि विजुअल स्टूडियो ने सीएल/सी ++ में लिखे गए मधुमक्खियों के कारण डीएलएल की प्रतिलिपि बनाने से इनकार कर दिया है। अंतर्निहित मुद्दा अभी भी खड़ा है और मुझे यहां एक जवाब पसंद आएगा, हालांकि अन्य जो माइक्रोसॉफ्ट के कारण अपना रास्ता खोजते हैं। SQLServer.Types.dll को इंस्टॉलर का उपयोग करना चाहिए। –

7

इस प्रश्न का उत्तर पहले ही दिया गया है, लेकिन मुझे लगा कि मैं आपकी परियोजनाओं की आउटपुट निर्देशिकाओं में सभी अप्रत्यक्ष संदर्भों की प्रतिलिपि बनाने के लिए एक सामान्य विफल-सुरक्षित विधि शामिल करूंगा।

  1. सेट कॉपी स्थानीयसभी संदर्भों को आप चाहते हैं के लिए सच को अपने उत्पादन के साथ शामिल किया जाना है।
  2. प्रतिलिपि अप्रत्यक्ष निर्भरता कोड (नीचे देखें) को CopyIndirectDependencies.targets नाम वाली फ़ाइल में सहेजें और अपनी प्रोजेक्ट निर्देशिका में लक्ष्य फ़ाइल रखें।
  3. आपके .csproj या .vbproj संपादित करें ताकि आपके द्वारा जोड़े गए .targets फ़ाइल में आयात शामिल किया जा सके। नीचे उदाहरण देखें।
  4. अपनी प्रोजेक्ट बनाएं और आपके पास बिल्ड आउटपुट में स्वचालित रूप से कॉपी की गई द्वितीयक निर्भरताएं होनी चाहिए।

CopyIndirectDependencies.targets फ़ाइल सामग्री आयात के साथ

<?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> 

नमूना परियोजना

<?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> 

स्रोत:http://blog.alexyakunin.com/2009/09/making-msbuild-visual-studio-to.html

+0

क्या इससे कोई फर्क पड़ता है कि प्रोजेक्ट फ़ाइल में चरण 3 में पंक्ति को जोड़ा गया है? उदाहरण के लिए, क्या इसे आफ्टरबिल्ड लक्ष्य या कहीं और (या कहीं भी) के तहत होना चाहिए? – longda

+4

हम्म, यह विजुअल स्टूडियो 2012 में काम नहीं करता है। मुझे आशा है कि मैं गलत हूं। – longda

+0

@ लोंगडा: इस आलेख को मैंने इस लेख के लिए भेजा है। इसमें एक नमूना परियोजना है। –