ได้คุณสามารถกำหนดเป้าหมายทั้ง x86 และ x64 ด้วยฐานรหัสเดียวกันในโปรเจ็กต์เดียวกัน โดยทั่วไปสิ่งต่างๆจะใช้งานได้หากคุณสร้างการกำหนดค่าโซลูชันที่เหมาะสมใน VS.NET (แม้ว่า P / Invoke ไปยัง DLL ที่ไม่มีการจัดการทั้งหมดมักจะต้องใช้รหัสเงื่อนไขบางอย่าง): รายการที่ฉันพบว่าต้องให้ความสนใจเป็นพิเศษ ได้แก่ :
- การอ้างอิงไปยังแอสเซมบลีที่มีการจัดการภายนอกที่มีชื่อเดียวกัน แต่มีบิตเนสเฉพาะของตัวเอง (ซึ่งใช้กับแอสเซมบลีการทำงานร่วมกันของ COM)
- แพ็คเกจ MSI (ตามที่ได้ระบุไว้แล้วว่าจะต้องกำหนดเป้าหมายเป็น x86 หรือ x64)
- การดำเนินการที่ใช้. NET Installer Class แบบกำหนดเองในแพ็คเกจ MSI ของคุณ
ปัญหาการอ้างอิงแอสเซมบลีไม่สามารถแก้ไขได้ทั้งหมดภายใน VS.NET เนื่องจากจะอนุญาตให้คุณเพิ่มการอ้างอิงที่มีชื่อที่กำหนดให้กับโปรเจ็กต์ได้เพียงครั้งเดียว ในการแก้ไขปัญหานี้แก้ไขไฟล์โครงการของคุณด้วยตนเอง (ใน VS คลิกขวาที่ไฟล์โครงการของคุณใน Solution Explorer เลือก Unload Project จากนั้นคลิกขวาอีกครั้งแล้วเลือก Edit) หลังจากเพิ่มการอ้างอิงถึงแอสเซมบลีเวอร์ชัน x86 ไฟล์โปรเจ็กต์ของคุณจะประกอบด้วยสิ่งต่างๆเช่น:
<Reference Include="Filename, ..., processorArchitecture=x86">
<HintPath>C:\path\to\x86\DLL</HintPath>
</Reference>
ห่อแท็กอ้างอิงนั้นไว้ภายในแท็ก ItemGroup ที่ระบุการกำหนดค่าโซลูชันที่ใช้กับเช่น:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
<Reference ...>....</Reference>
</ItemGroup>
จากนั้นคัดลอกและวางแท็ก ItemGroup ทั้งหมดและแก้ไขให้มีรายละเอียดของ DLL 64 บิตของคุณเช่น:
<ItemGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<Reference Include="Filename, ..., processorArchitecture=AMD64">
<HintPath>C:\path\to\x64\DLL</HintPath>
</Reference>
</ItemGroup>
หลังจากโหลดโปรเจ็กต์ของคุณใหม่ใน VS.NET กล่องโต้ตอบการอ้างอิงแอสเซมบลีจะสับสนเล็กน้อยกับการเปลี่ยนแปลงเหล่านี้และคุณอาจพบคำเตือนบางอย่างเกี่ยวกับแอสเซมบลีกับตัวประมวลผลเป้าหมายที่ไม่ถูกต้อง แต่งานสร้างทั้งหมดของคุณจะทำงานได้ดี
การแก้ปัญหา MSI เป็นเรื่องต่อไปและน่าเสียดายที่สิ่งนี้จะต้องใช้เครื่องมือที่ไม่ใช่ VS.NET: ฉันชอบตัวติดตั้งขั้นสูงของ Caphyon เพื่อจุดประสงค์นั้นเนื่องจากมันดึงเคล็ดลับพื้นฐานที่เกี่ยวข้องออกไป (สร้าง MSI ทั่วไปรวมทั้ง 32 บิต และ MSI เฉพาะ 64 บิตและใช้ตัวเรียกใช้การตั้งค่า. EXE เพื่อแยกเวอร์ชันที่ถูกต้องและทำการแก้ไขที่จำเป็นในรันไทม์) ได้เป็นอย่างดี
คุณอาจได้ผลลัพธ์เดียวกันโดยใช้เครื่องมืออื่น ๆ หรือชุดเครื่องมือWindows Installer XML (WiX)แต่ Advanced Installer ทำให้สิ่งต่าง ๆ ง่ายมาก (และราคาไม่แพงเลย) ซึ่งฉันไม่เคยมองหาทางเลือกอื่นเลย
สิ่งหนึ่งที่คุณอาจยังต้องใช้ WiX แม้ว่าจะใช้โปรแกรมติดตั้งขั้นสูง แต่ก็มีไว้สำหรับการดำเนินการแบบกำหนดเองของ. NET Installer Class แม้ว่าจะเป็นเรื่องเล็กน้อยในการระบุการกระทำบางอย่างที่ควรทำงานบนบางแพลตฟอร์มเท่านั้น (โดยใช้เงื่อนไขการดำเนินการ VersionNT64 และ NOT VersionNT64 ตามลำดับ) การดำเนินการแบบกำหนดเองของ AI ในตัวจะดำเนินการโดยใช้ Framework 32 บิตแม้ในเครื่อง 64 บิต .
สิ่งนี้อาจได้รับการแก้ไขในรุ่นในอนาคต แต่สำหรับตอนนี้ (หรือเมื่อใช้เครื่องมืออื่นในการสร้าง MSI ของคุณที่มีปัญหาเดียวกัน) คุณสามารถใช้การสนับสนุนการดำเนินการที่กำหนดเองที่มีการจัดการของ WiX 3.0 เพื่อสร้าง DLL การดำเนินการที่มีบิตที่เหมาะสมที่ จะดำเนินการโดยใช้ Framework ที่เกี่ยวข้อง
แก้ไข: ในเวอร์ชัน 8.1.2 โปรแกรมติดตั้งขั้นสูงรองรับการกระทำแบบกำหนดเอง 64 บิตอย่างถูกต้อง เนื่องจากคำตอบเดิมของฉันราคาจึงเพิ่มขึ้นเล็กน้อย แต่น่าเสียดายที่แม้ว่าจะยังคงคุ้มค่ามากเมื่อเทียบกับ InstallShield และ ilk ...
แก้ไข: หาก DLL ของคุณลงทะเบียนใน GAC คุณยังสามารถใช้แท็กอ้างอิงมาตรฐานด้วยวิธีนี้ (SQLite เป็นตัวอย่าง):
<ItemGroup Condition="'$(Platform)' == 'x86'">
<Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86" />
</ItemGroup>
<ItemGroup Condition="'$(Platform)' == 'x64'">
<Reference Include="System.Data.SQLite, Version=1.0.80.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=AMD64" />
</ItemGroup>
เงื่อนไขนี้ยังลดลงเป็นประเภทบิวด์รีลีสหรือดีบักทั้งหมดและระบุสถาปัตยกรรมโปรเซสเซอร์เท่านั้น