เมื่อฉันพยายามสร้างอินสแตนซ์ของคลาส COM มันจะแสดงข้อยกเว้นเป็น
ไม่ได้ลงทะเบียนคลาส (ข้อยกเว้นจาก HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
โปรดแนะนำว่าฉันจะแก้ปัญหาได้อย่างไร
เมื่อฉันพยายามสร้างอินสแตนซ์ของคลาส COM มันจะแสดงข้อยกเว้นเป็น
ไม่ได้ลงทะเบียนคลาส (ข้อยกเว้นจาก HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
โปรดแนะนำว่าฉันจะแก้ปัญหาได้อย่างไร
คำตอบ:
ดูเหมือนว่าโปรแกรมหรือกระบวนการใดที่คุณกำลังพยายามเริ่มต้นนั้นไม่ได้ติดตั้งบนเครื่องของคุณมีการติดตั้งที่เสียหายหรือจำเป็นต้องลงทะเบียน
ติดตั้งซ่อมแซม (ผ่าน Add / Remove Programs) หรือลงทะเบียน (ผ่าน Regsvr32.exe)
คุณไม่ได้ให้ข้อมูลเพียงพอสำหรับเราที่จะช่วยเหลือคุณมากไปกว่านี้
คุณต้องแน่ใจว่าแอสเซมบลีทั้งหมดของคุณคอมไพล์สำหรับสถาปัตยกรรมที่ถูกต้อง ลองเปลี่ยนสถาปัตยกรรมสำหรับ x86 หากการติดตั้งคอมโพเนนต์ COM ใหม่ไม่ได้ผล
ปัญหาของฉันและวิธีแก้ปัญหา
ฉันมี dll ของบุคคลที่สาม 32 บิตซึ่งฉันได้ติดตั้งในเครื่อง 2008 R2 ซึ่งเป็น 64 บิต
ฉันมีบริการ wcf ที่สร้างใน. net 4.5 framework ซึ่งเรียกใช้ dll ของบุคคลที่สาม 32 บิตสำหรับกระบวนการ ตอนนี้ฉันได้สร้างคุณสมบัติที่ตั้งค่าเป็นเป้าหมาย 'cpu' ใด ๆ และปรับใช้กับเครื่อง 64 บิต
เมื่อฉันพยายามเรียกใช้บริการ wcf มีข้อผิดพลาด "80040154 คลาสไม่ได้ลงทะเบียน (ข้อยกเว้นจาก HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG"
ตอนนี้ฉันใช้ ProcMon.exe เพื่อติดตามปัญหารีจิสทรีของ com และระบุว่ากระบวนการนี้กำลังค้นหารายการรีจิสทรีที่ HKLM \ CLSID และ HKCR \ CLSID ซึ่งไม่มีรายการ
ทราบมาว่า Microsoft จะไม่ลงทะเบียนคอมโพเนนต์ 32 บิต com ไปยังพา ธ HKLM \ CLSID, HKCR \ CLSID ในเครื่อง 64 บิต แต่จะวางรายการในเส้นทาง HKLM \ Wow6432Node \ CLSID และ HKCR \ Wow6432Node \ CLSID
ตอนนี้ข้อขัดแย้งคือกระบวนการ 64 บิตที่พยายามเรียกใช้กระบวนการ 32 บิตในเครื่อง 64 บิตซึ่งจะค้นหารายการรีจิสทรีใน HKLM \ CLSID, HKCR \ CLSID วิธีแก้ปัญหาคือเราต้องบังคับให้กระบวนการ 64 บิตดูรายการรีจิสทรีที่ HKLM \ Wow6432Node \ CLSID และ HKCR \ Wow6432Node \ CLSID
สิ่งนี้สามารถทำได้โดยการกำหนดค่าคุณสมบัติโครงการบริการ wcf เพื่อกำหนดเป้าหมายไปยังเครื่อง "X86" แทน "Any"
หลังจากปรับใช้เวอร์ชัน 'X86' กับเซิร์ฟเวอร์ 2008 R2 พบปัญหา "System.BadImageFormatException: ไม่สามารถโหลดไฟล์หรือแอสเซมบลี"
วิธีแก้ปัญหา badimageformatexception นี้คือการตั้งค่า 'Enable32bitApplications' เป็น 'True' ในคุณสมบัติ IIS Apppool สำหรับแอปพูลที่เหมาะสม
โปรดทราบว่าบริบทของคลาสเมื่อเริ่มต้นสามารถสร้างข้อยกเว้นนั้นได้ หากคุณมีวัตถุที่เข้ารหัสเป็น INPROC_SERVER แต่คุณพยายาม CoCreateInstance เป็น CLSCTX_LOCAL_SERVER คุณจะได้รับข้อผิดพลาดนั้นด้วย
คุณต้องแน่ใจว่าวัตถุได้รับการลงทะเบียนแล้วและ CoCreateInstance กำลังสร้างอินสแตนซ์ที่มีบริบทของคลาสที่ถูกต้อง
DesktopWallpaper
โดยใช้CLSCTX_INPROC
(แทนCLSCTX_ALL
) คุณจะได้รับ0x80040154 (REGDB_E_CLASSNOTREG)
ข้อผิดพลาด
หากคุณใช้คอมโพเนนต์ COM 64 บิตในเว็บแอปพลิเคชันบน IIS ตรวจสอบให้แน่ใจว่าพูลแอปพลิเคชันถูกตั้งค่าไม่ให้อนุญาตแอปพลิเคชัน 32 บิต ( เปิดใช้งานแอปพลิเคชัน32 บิต: เท็จในการตั้งค่าขั้นสูง)
ฉันทำให้มันทำงานได้โดยการเปิดใช้งานแอปพลิเคชัน 32 บิตในการตั้งค่าขั้นสูงของ Application Pool คลิกขวาที่แอปพลิเคชันพูลและเลือกการตั้งค่าขั้นสูง - เปิดใช้งานแอปพลิเคชัน 32 บิต สิ่งนี้อาจช่วยใครบางคนได้
วิธีที่ฉันแก้ไขปัญหานี้คือการลงทะเบียนCOM
ผ่านregsvr32
.
ตรวจสอบให้แน่ใจว่า COM ที่คุณเรียกใช้นั้นได้รับการลงทะเบียนแล้ว
แอปพลิเคชันของฉันใช้งานอยู่xceedcry.dll
และฉันไม่ได้ลงทะเบียน เมื่อฉันลงทะเบียนแล้วแอปพลิเคชันก็ทำงานได้ดี
ในกรณีของฉันคลาสได้รับการลงทะเบียนอย่างถูกต้องและสร้างขึ้นใน โหมดCPU / 64 บิตใด ๆ
แต่เปิดใช้งานโปรแกรม 32 บิตทรัพย์สินของสระว่ายน้ำ IIS แอพลิเคชันของแอพลิเคชันที่ใช้ในชั้นเรียนถูกกำหนดให้ทรู
ไม่พบคลาสเนื่องจากสถาปัตยกรรมไม่ตรงกันระหว่างคอนฟิกูเรชันพูลแอ็พพลิเคชันและคลาสที่ลงทะเบียนจริง
การตั้งค่าเปิดใช้งานแอปพลิเคชั่น 32 บิตเป็นFalse ช่วยแก้ไขปัญหา
สำหรับฉันฉันต้องสร้างคอนฟิกูเรชันบิลด์ 64 บิต
ฉันมีปัญหาเดียวกันกับการใช้ MapWinGis ฉันพบวิธีแก้ปัญหาโดยทำงานบนหน้าต่าง Visual Studio 2015 ในรูปแบบ proyect เพียงคลิกขวาที่ proyect-> properties-> Build ตั้งค่าการกำหนดค่าเป็นการกำหนดค่าทั้งหมดและใน conbobox "เป้าหมายแพลตฟอร์ม" ตั้งค่าเป็น x64
ฉันพบปัญหานี้ในการเรียกแอสเซมบลี. Net จากไคลเอนต์ C ++ ผ่าน COM ปรากฎว่าไม่พบหนึ่งในแอสเซมบลีของแอสเซมบลี. Net ที่ขึ้นอยู่กับไม่พบ ฉันต่อสู้อยู่พักหนึ่งเพื่อพยายามคิดว่ามีอะไรผิดปกติกับการชุมนุมครั้งที่ 1 แต่จริงๆแล้วมันเป็นหนึ่งในการอ้างอิงของการชุมนุมครั้งที่ 1 ฉันได้รับข้อผิดพลาดสองข้อที่แตกต่างกันเมื่อเรียก CoCreateInstance () จากไคลเอนต์ C ++ ครั้งแรกคือ: REGDB_E_CLASSNOTREG คลาสไม่ได้ลงทะเบียน และการลองครั้งที่สองคือ: 0x80131040: นิยามรายการของแอสเซมบลีที่อยู่ไม่ตรงกับการอ้างอิงแอสเซมบลี
ดังนั้นตรวจสอบว่ามีการอ้างอิงการชุมนุมของคุณอยู่ ฉันค้นพบสิ่งนี้โดยเรียกดูแอสเซมบลีที่ 1 ด้วย dotPeek และสังเกตเห็นหนึ่งในการอ้างอิงขาดหายไป การวางเวอร์ชันที่ถูกต้องของการอ้างอิงในโฟลเดอร์จะช่วยแก้ไขข้อผิดพลาดทั้งสอง
ฉันกำลังรวบรวมแอปพลิเคชันของฉันที่กำหนดเป้าหมายCPUและปัญหาหลักปรากฎว่า adobe reader ที่ติดตั้งv10.xรุ่นเก่าต้องอัพเกรด v11.xนี่คือวิธีที่ฉันจะแก้ไขปัญหานี้ได้
ฉันพบปัญหาเดียวกันโดยใช้คลาส COM นั่นคือ 'คลาสไม่ได้ลงทะเบียนข้อยกเว้น' ที่รันไทม์ สำหรับฉันฉันสามารถแก้ไขได้โดยไปที่ไฟล์ app.config และเปลี่ยนองค์ประกอบ 'เริ่มต้น' และ 'รันไทม์ที่รองรับ' เป็น:
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
สามารถอ่านรายละเอียดเพิ่มเติมได้ที่นี่http://stackoverflow.com/questions/1604663/
และที่นี่https://msdn.microsoft.com/en-us/library/w4atty68(v=vs.110).aspx
ฉันควรทราบว่าฉันใช้ Visual Studio 2017 Target cpu = x86 Embed Interop Type = true (ในหน้าต่างคุณสมบัติ)
ไปที่ไดเร็กทอรีของ. Net framework และลงทะเบียน dll ตามลำดับด้วย พา ธ dll พื้นที่สีขาวRegsvr32.exe
ฉันประสบปัญหาเดียวกัน หลังจากทำวิจัยแล้วฉันพบวิธีแก้ไขสำหรับฉันและอาจมีประโยชน์ ปัญหาไม่เพียง แต่เกี่ยวข้องกับการติดตั้งใหม่ตามการสังเกตของฉัน แต่ยังขึ้นอยู่กับสิทธิ์การเข้าถึงด้วย
ขั้นตอนที่ 1: ซ่อมแซมวัตถุ COM เฉพาะ
ขั้นตอนที่ 2: บริการคอมโพเนนต์> คอมพิวเตอร์> คอมพิวเตอร์ของฉัน> การกำหนดค่า DCOM> เลือกวัตถุ COM ของคุณ> คลิกขวา> คุณสมบัติ> แท็บความปลอดภัย> สิทธิ์การเข้าถึง> เลือกกำหนดเอง> คลิกแก้ไข> เลือก IIS_USER (หากไม่มีอยู่ให้สร้างด้วยสิทธิ์ที่สมบูรณ์) และให้สมบูรณ์ เข้าถึงและคลิกตกลง
ย้ายไปที่แท็บ Identity> คุณสามารถเลือก "ผู้ใช้แบบโต้ตอบ" หรือ "ผู้ใช้รายนี้"> คลิกใช้และตกลง หากคุณเลือก "ผู้ใช้รายนี้" เราจะต้องให้สิทธิ์ผู้ดูแลระบบแก่เซิร์ฟเวอร์นั้น
ขั้นตอนที่ 3: เปิด IIS Manager> รีสตาร์ท Application Pools
หมายเหตุ: หากจำเป็นโปรดรีสตาร์ทเซิร์ฟเวอร์
ที่นี่ค้นหาวิธีแก้ปัญหาเรียกใช้เครื่องมือ mmc -32 (ไม่ใช่ dcomcfg)
บนระบบ 64 บิตพร้อม Office 32 บิตให้ลองทำดังนี้:
Start
Run
mmc -32
File
Add Remove Snap-in
Component Services
Add
OK
Console Root
Component Services
Computers
My Computer
DCOM Config
Microsoft Excel Application