แก้ไขปัญหา sgen.exe ล้มเหลวในการสร้างใน Visual Studio

หากคุณประสบปัญหากับ sgen.exe ที่ล้มเหลวในกระบวนการสร้าง ใน Visual Studio คุณไม่ได้อยู่คนเดียว นักพัฒนาหลายคนพบว่าตนต้องต่อสู้กับข้อผิดพลาดนี้ โดยเฉพาะอย่างยิ่งหลังจากการเปลี่ยนไดเรกทอรีเอาต์ของโครงการ บทแนะนำนี้จะช่วยให้คุณเข้าใจปัญหาและให้วิธีแก้ไขที่มีประสิทธิภาพในการแก้ไขมัน

เข้าใจปัญหา

การเปลี่ยนไดเรกทอรีเอาต์ของโครงการ Visual Studio ของคุณอาจทำให้ sgen.exe ล้มเหลวด้วยข้อผิดพลาดต่อไปนี้:

Error: The specified module could not be found. (Exception from HRESULT: 0x8007007E)
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targets(1902,9): error MSB6006: "sgen.exe" exited with code 1.

ข้อผิดพลาดนี้มักเกิดขึ้นเนื่องจากพาธที่ส่งไปยัง sgen.exe ในการตั้งค่าการสร้างยังคงไม่เปลี่ยนแปลงหลังจากการเปลี่ยนไดเรกทอรีเอาต์

อาการของปัญหา

  • กระบวนการสร้างล้มเหลว โดยโยนข้อผิดพลาดที่เกี่ยวข้องกับ sgen.exe
  • แม้หลังจากการปรับเปลี่ยนการตั้งค่าคอนฟิก ข้อผิดพลาดก็ยังคงอยู่
  • วิธีการแก้ไขชั่วคราวอาจปิดการใช้งานฟีเจอร์ที่สำคัญ เช่น การสร้างการทำให้เป็นอนุกรม

วิธีการแก้ไขปัญหา

วิธีการที่ 1: การกำหนดค่าด้วยตนเองของ sgen.exe

อีกวิธีที่มีประสิทธิภาพในการแก้ไขปัญหานี้คือการปรับเปลี่ยนพารามิเตอร์สำหรับ sgen.exe ในไฟล์โครงการของคุณด้วยตนเอง

ขั้นตอนในการปรับแต่งตัวเลือก sgen.exe:

  1. เปิดไฟล์โครงการของคุณ
    ใช้โปรแกรมแก้ไขข้อความที่คุณเลือกเพื่อเปิดไฟล์ .csproj หรือ .vbproj

  2. ปรับเปลี่ยนการกำหนดเป้าหมาย
    คุณสามารถเพิ่มเป้าหมายที่บอกให้ sgen.exe กำหนดตัวเลือกการสร้างอนุกรมอย่างชัดเจน โดยตัวอย่างโค้ดคือ:

    <Target Name="GenerateSerializationAssembliesForAllTypes"
      DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource"
      Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)"
      Outputs="$(OutputPath)$(_SGenDllName)">
        <SGen BuildAssemblyName="$(TargetFileName)"
          BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)"
          ShouldGenerateSerializer="true" UseProxyTypes="true"
          KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)"
          DelaySign="$(DelaySign)" ToolPath="$(SGenToolPath)">
            <Output TaskParameter="SerializationAssembly"
              ItemName="SerializationAssembly" />
        </SGen>
    </Target>
    
  3. ล็อคการเปลี่ยนแปลง
    ตรวจสอบให้แน่ใจว่าคุณตั้งค่า UseProxyTypes เป็น true ซึ่งจะช่วยให้คุณควบคุมวิธีการที่ประเภทต่างๆ ถูกทำให้เป็นอนุกรม

  4. สร้างโปรเจ็กต์ของคุณใหม่
    เมื่อบันทึกการเปลี่ยนแปลงแล้ว ให้สร้างโปรเจ็กต์ของคุณใหม่ใน Visual Studio เพื่อใช้การกำหนดค่าที่ใหม่

วิธีการที่ 2: อ้างอิงเอกสาร

เพื่อความเข้าใจที่ดีขึ้นและการปรับแต่งเพิ่มเติม ควรพิจารณาอ้างอิงเอกสาร MSDN เกี่ยวกับ sgen.exe ซึ่งมีตัวเลือกและพารามิเตอร์ฉบับละเอียดสำหรับเครื่องมือ

แหล่งข้อมูลเพิ่มเติมสามารถพบได้ใน บล็อกโพสต์นี้ ที่พูดคุยเกี่ยวกับรายละเอียดของ sgen และเคล็ดลับในการจัดการการทำให้เป็นอนุกรมอย่างมีประสิทธิภาพ

ข้อแนะนำเพิ่มเติม

  • ลบ .XmlSerializers.dll ก่อนหน้า
    หากคุณยังคงพบปัญหา ให้พิจารณาลบไฟล์ .XmlSerializers.dll ในไดเรกทอรีเอาต์เพื่อให้แน่ใจว่ามีการเริ่มใหม่

  • ตรวจสอบอีกครั้งเพื่อให้แน่ใจว่ามีการอ้างอิงที่ถูกต้อง
    ตรวจสอบให้แน่ใจว่าทุกพาธไปยัง assembly ที่มีความเกี่ยวข้องยังคงถูกต้องหลังจากการเปลี่ยนตำแหน่งเอาต์พุต

สรุป

การเผชิญหน้ากับความล้มเหลวของ sgen.exe อาจทำให้รู้สึกยุ่งยาก โดยเฉพาะในช่วงเวลาที่พัฒนาอย่างเข้มข้น ด้วยการปรับแต่งไฟล์โครงการของคุณและจัดการการกำหนดค่าอย่างรอบคอบ คุณสามารถแก้ไขปัญหาดังกล่าวอย่างมีประสิทธิภาพ อย่าลืมสำรองไฟล์โครงการเดิมของคุณก่อนที่จะแก้ไขที่สำคัญ

ด้วยกลยุทธ์เหล่านี้ คุณควรจะมีอุปกรณ์ที่จำเป็นในการจัดการและป้องกันข้อผิดพลาดในการสร้างที่เกี่ยวข้องกับ sgen.exe ใน Visual Studio!