Rebuild COM Interop DLL ด้วย VS2022 เจอ Runtime Error 3001 แต่ VS2019 ทำงานได้

ช่วงนี้ผมได้กลับไปช่วยดู DLL เก่าตัวนึงครับ ทำไว้มานาน 8-9 ปีแล้ว โดยเจ้า DLL ตัวนี้ เป็นตัว COM Interop ที่เอาไปให้ตัว VB6 ไป Reference ใช้งาน หน้าที่มันจะประมาณว่า VB6 ส่งคำสั่งไปให้ .NET มันทำงาน แล้วตัว .NET ได้ Result มาเป็น DataTable แล้วหน้าที่ตัว COM Interop ทำหน้าที่แปลง DataTable มาเป็น VB6 Recordset ครับ //อันนี้เดี๋ยวว่างๆจะเขียน Blog อีกอธิบายการทำงานอีกที ส่วน Version 2 จะป็นตัว pipe ลด Coupling ลง

กลับมาที่ปัญหาดีกว่า COM Interop ที่เป็น .NET Framework 4.5.2 มันต้องทำหน้าที่เพิ่ม จากเดิมที่ยิง REST แต่ไม่รองรับ JWT ครับ งานนี้ เราต้องมาเพิ่มให้กับมันครับ แต่ทว่าหลังแก้ไข

  • ให้รองรับ JWT
  • ขยับจาก .NET Framework 4.5.2 มาเป็น .NET Framework 4.8 สูงสุดที่ทำได้แล้ว เพราะลองไปดู csproj ของ .NET Core / .NET6 มันจะไม่มี Option Register for COM Interop แล้วครับ
  • จากนั้น RegAsm.exe 32 Bit (Path C:\Windows\Microsoft.NET\Framework\v4.0.30319) มา Register.

ตอน Deploy และเอาไฟล์ .tlb มา Reference กับ VB6 Project ปรากฏว่ามันรันไม่ได้ครับ เจอ Runtime Error 3001: Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another

พอลองไปดู Reference ADO Error Reference - ActiveX Data Objects (ADO) ที่น่าจะใช่นะ จะบอกว่าชื่อ Column ผิด (typographical error) ได้ Keyword มาแล้ว

จากนั้นลองมา Try& Error ดูครับ

  • Try1 ตรวจชื่อ Column มีผิดไหมนะ >> ไม่ผิด
  • Try2 Matching Data Type ไม่ Match หรือป่าว ? >> ไม่ใช่นะ
  • Try3 ตรวจData Type ของ Column และ Value ของ DataTable ว่าตัว Encoding มันแปลกไป หรือป่าว ปรากฏว่าปกติ และลองแปลงให้เป็น ASCII >> ยังไม่ได้
  • Try4 ถอยกลับไปใช้ Visual Studio 2019 มาลอง Build แล้ว Test เชี่ย รันได้เฉย มันต้องมีพลังงานลึกลัพธ์ซ่อนอยู่แน่ๆเลย

จาก Try4 ลองดูว่า Visual Studio 2022 กับ 2019 มันมีอะไรปีปรับไปบ้าง Visual Studio 2022 ออกตัวจริง รองรับ 64 บิต, .NET 6, Hot Reload >> รองรับ 64 bits แสดงว่า MSBuild น่าจะถูกปรับตามไปด้วย เริ่มส่งสัย Option Platform Target ครับ

ลองหาต่อ มีคนเจอเหมือนกันนะ

C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets
  • พอไปไล่ Config มันจะไปเอาค่าจาก PlatformTargetAsMSBuildArchitecture ถ้าเราไปกำหนด PlatformTarget = AnyCPU มันจะอิงตามตัว msbuild 64 bits ตาม Visual Studio 2022 ครับ
  • ลอง try5 ปรับ Option Platform Target จาก AnyCPU > x86 ทดสอบแล้ว ปรากฏว่าตัว VB6 ทำงานได้ครับ ไม่เจอ Runtime Error 3001 แล้วครับ

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.