2010-01-14 21 views
6

Biz yönetilmeyen DLL etrafında bir C# sarıcı oluştururken için yönetilen sarıcı oluşturuluyor. Yönetilmeyen DLL, hem 32 hem de 64bit sürümlerinde gelir. Yönetilen paketleyiciyi kendi projesinde tutarız, böylece ayrı bir bileşen olarak oluşturabiliriz ve çözümler arasında yeniden kullanabiliriz.32bit ve 64bit yönetilmeyen DLL

Ancak bu bazı sorunlara yol açar. Yönetilmeyen DLL, 32bit ve 64bit sürümleri için aynı ada sahip olduğundan, doğru yönetilmeyen DLL (bin) dizinine doğru yönetilmeyen bir DLL taşıma sorunu yaşıyorsanız. Yapılandırma x86 ise 32bit sürümünü ve x64 64bit'i kopyalamak isteriz. Sadece bir işlemci mimarisi ile bunu başarmak kolaydır. Sadece projemizdeki yönetilmeyen DLL'yi ekledik ve dosya üzerinde yerel kopyayı yerel olarak ayarladık. Ama hem daha zor olanı hedeflememiz gerektiğinden.

Biz bu bağlantıyı Targeting both 32bit and 64bit with Visual Studio in same solution/project buldum ama bu makinede zaten mevcut bazı DLL başvurmak gibi görünüyor. Çıktının (bin) kopyalanması için DLL dosyasının doğru sürümünü istiyoruz. Bunu çözmek için nasıl

Herhangi bir ipucu veya teknikler daha fazla kabul edilir.

cevap

1

Sen senin bu durumda kurar kontrol etmek MSBuild gibi bir şey kullanarak içine bakmak isteyebilirsiniz. Ardından, 32 veya 64 bit derlemeyi yapmak için kullandığınız bir derleme bayrağı olabilir. Bunu yaparak hangi dll'yi zorlayacağınızı da kontrol etmenizi sağlar. Bu en iyi seçeneğin gibi geliyor. Msbuild'den hoşlanmıyorsanız, nant'ı da kullanabilirsiniz.

1

Bir diğer seçenek belki .... vb Debug32 ve Debug64, yapılandırma ayarlarından biri CPU mimarisidir Debug yanında, Visual Studio'da yeni Yapılandırma oluşturmak ve serbest bırakın olacaktır.

Ardından Projesi sonrası inşa olaylarda, sen ... koşulu olarak platformu adı makro kullanarak/else eğer eski moda

yapmak Veya yapabilirsiniz Eğer çözümde alt dizin olarak Platformu adı kullanılırsa yönetilmeyen dll'nin depolandığı yerde, platform ismini bin dizinine kullanarak dizinden kopyalayabilirsiniz.

0

Yapılandırmanızı, 32 bit ve 64 bit sürümleri için olmak üzere iki platform olacak şekilde ayarlarsanız. Sonra her bir platform için referansı doğru dll sürümüne ayarladınız, sonra yapmanız gereken tek şey referans özelliklerinizdeki yerel bayrağı kopyalamak ve vst'ler sizin için her şeyi ele alacaktır. Hayır yaygara yok.

5

Sadece FreeImage kitaplığı için .Net sarıcı ile aynı sorunu yaşadım. Yaptığım şey yönetilen sarıcıya başvuran proje için x86 için bir ve x64 için bir tane olmak üzere iki yapı yapılandırması oluşturmaktı. Öyle gibi proje dosyasının AfterBuild hedefteki Msbuild koşullu kopya bölümleri eklendi:

<Target Name="AfterBuild"> 
    <Copy Condition="'$(Platform)' == 'X86'" SourceFiles="$(MSBuildProjectDirectory)\Resources\x86\FreeImage.dll" DestinationFolder="$(TargetDir)" /> 
    <Copy Condition="'$(Platform)' == 'X64'" SourceFiles="$(MSBuildProjectDirectory)\Resources\x64\FreeImage.dll" DestinationFolder="$(TargetDir)" /> 
    </Target> 
+0

Merhaba ve cevap için teşekkürler. Sarmalayıcı projesinin proje dosyasında önerdiğiniz gibi satış sonrası hedefini uyguladık. Ancak, sarmalayıcı projeye başvuran diğer projelerden yönetilmeyen DLL, sarmalayıcı DLL'si ile birlikte bin dizinine kopyalanmaz. Bunu nasıl başaracağınıza dair ipuçları var mı? – flalar

+0

Genellikle, hepimiz dolaylı meclisleri yüklenen dinamik olarak başvurulan ve/veya için ne bir post inşa komutuyla ortak çıkış klasöre projelerini TargetDir onları itmek olduğunu. Daha sonra, onlara ihtiyaç duyan herhangi bir proje, bunları bir ön/son oluştur komutuyla birlikte TargetDirlerine kopyalar. örnek itme: xcopy "$ (TargetDir) $ (TargetFileName)" "$ (SolutionDir) PluginOutput \"/E/Y örnek çekme: xcopy "$ (SolutionDir) PluginOutput \ * dll" "$ (TargetDir) "/ E/Y – duckworth

+0

FreeImage DLL dosyasının x64 sürümünü nereden buldunuz? Bir süredir bunun peşindeydim, ama bir dikiş yok! –

1

Biz bu konuda projelerimizle her zaman başa.

32- ve 64-bit sürümleri olan yönetilmeyen bir C++ DLL ve yönetilmeyen DLL'ye çağırmak için P/Invoke kullanan bir C# projemiz var. C++ DLL için

, bu Hedef Yoludur var:

$ \ $ HedefAdı (PLATFORMNAME) \ $ (ConfigurationName'ini))

Yani 32 bit Sürüm oluşturma Win32 \ Release içinde gider ve 64 bit hata ayıklama yapısı x64 \ Debug dizininde gider.C# projesi biz 'Herhangi bir CPU' yapılandırmasını silmek ve yeni bir 'x86' yapılandırma ve bir 'x64' yapılandırma ile değiştirin olarak

. Onun çıkış dizinleri NET derleyici C++ kullanan ve 'Win32' 32-bit mimarisi yürütülebilir belirtmek için ise 'x86' kullanması dışında yönetilmeyen C++ DLL benzer. C# projesi için post-build adımda

biz C# yürütülebilir için hedef dizine uygun yönetilmeyen DLL kopyalayabilirsiniz. Her mimarinin ve C# projesinin her yapılandırmasının ayrı bir çıkış dizinine sahip olması nedeniyle, yönetilmeyen DLL dosyasının hangi mimarisinin hangi çıkış dizininde olduğu konusunda herhangi bir sorun yoktur; her zaman eşleşiyorlar.

Bunu daha da basitleştirmek için, çok dosya bir derlemeyi (http://msdn.microsoft.com/en-us/library/226t7yxe.aspx) oluşturmayı araştırmanızı öneririm; böylece yönetilmeyen DLL dosyanız ve C# sarmalayıcınız her ikisi de tek bir .NET derlemesinde bulunabilir ve bu da kopyalamayı hiç zahmetsiz kılar.

+0

Bu yüzden bir çok dosya grubu derlemesi bir C# derlemesi olurdu. Bu x86 ve x64 yönetilmeyen dll hem içerir ve uygun olanı yükler? – flalar

+0

Tam olarak değil. C# ile yazılmış ManagedAssembly.dll dosyasını ve C++ 'da NativeAssembly.dll dosyasının hem 32 hem de 64 bit sürümlerini olduğunu varsayalım. ManagedAssembly.dll ve 32 bit NativeAssembly.dll ve diğeri ManagedAssembly.dll ve 64 bit NativeAssembly.dll ile iki çok dosya derlemesi oluşturabilirsiniz. Bu şekilde, mimari-agnostik ve mimariye özgü DLL'lerin bir karışımı yerine yalnızca bir DLL bağımlılığı hakkında endişelenmeniz gerekir. – anelson