ไม่สามารถเพิ่มการอ้างอิงถึง dll


95

เมื่อฉันเพิ่มไฟล์. dll เป็นข้อมูลอ้างอิงในแอปพลิเคชัน C # มันแสดงข้อผิดพลาด:

ไม่สามารถเพิ่มการอ้างอิงถึง ".... dll" ได้โปรดตรวจสอบให้แน่ใจว่าไฟล์สามารถเข้าถึงได้และเป็นแอสเซมบลีหรือคอมโพเนนต์ COM ที่ถูกต้อง

ILDissassembler บอกว่าไม่มีส่วนหัว CLR ที่ถูกต้องดังนั้นฉันจึงพยายามลงทะเบียนโดยใช้ regsvr32 และนั่นทำให้ฉันมีข้อผิดพลาดอื่น:

โหลดโมดูล "" แล้ว แต่การเรียกไปยัง DLLRegisterServer ล้มเหลวโดยมีรหัสข้อผิดพลาด "0x80004005"

ฉันใช้ VS2010 รุ่น Ultimate บนเครื่อง 64 บิต Windows 7 อะไรคือปัญหา?

ขอบคุณสำหรับคำแนะนำ / คำตอบ

คำตอบ:


54

สิ่งต่อไปนี้ใช้ได้ผลสำหรับฉัน:

คำตอบสั้น ๆ

เรียกใช้สิ่งต่อไปนี้ผ่านบรรทัดคำสั่ง (cmd):

TlbImp.exe cvextern.dll        //where cvextern.dll is your dll you want to fix.

และ dll ที่ถูกต้องจะถูกสร้างขึ้นสำหรับคุณ

คำตอบที่ยาวขึ้น

  • เปิด cmd

  • ค้นหา TlbImp.exe อาจอยู่ใน C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin หากคุณไม่พบให้ไปที่โฟลเดอร์รากของคุณ (C: \ หรือ D :) แล้วเรียกใช้:

    dir tlbimp.exe /s              //this will locate the file.
    
  • เรียกใช้ tlbimp.exe แล้ววาง dll ไว้ข้างหลัง ตัวอย่าง: หาก dll ของคุณคือ cvextern.dll คุณสามารถเรียกใช้:

    TlbImp.exe cvextern.dll
    
  • มีการสร้าง dll ใหม่ในโฟลเดอร์เดียวกันของ tlbimp.exe คุณสามารถใช้เป็นข้อมูลอ้างอิงในโครงการของคุณ

5
อีกวิธีหนึ่งในการเข้าถึง TlbImp.exe คือการเปิดพรอมต์คำสั่ง Visual Studio
Scott

75
@Memet Afer พยายามนี้ฉันมีTlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library.ข้อเสนอแนะใด ๆ ?
Dineshkumar

1
ไฟล์อินพุต C: \ Windows \ SYSTEM32 \ SqlServerSpatial.dll 'ไม่ใช่ไลบรารีชนิดที่ถูกต้อง
Christine

7
มีข้อผิดพลาดเดียวกันกับที่ระบุโดย Dineshkumar Ponnusamy โปรดช่วยฉันด้วย
deathrace

1
คุณต้องใช้ TLBMP เมื่อใด โดยปกติใน VS2015 หากคุณเพิ่มการอ้างอิงไปยัง COM DLL จากหน้าต่างการอ้างอิงจะดูแลทั้งหมดนี้ให้คุณ
UuDdLrLrSs

20

คุณสามารถเพิ่ม DLL (หรือ EXE) ให้กับโปรเจ็กต์ได้ก็ต่อเมื่อเป็นแอสเซมบลี. NET หากไม่ใช่คุณจะเห็นข้อความแสดงข้อผิดพลาดนี้

regsvr32 ยังตั้งสมมติฐานบางประการเกี่ยวกับโครงสร้างและฟังก์ชันที่ส่งออกใน DLL เป็นเวลานานแล้วที่ฉันใช้มัน แต่เกี่ยวข้องกับการลงทะเบียนเซิร์ฟเวอร์ COM ดังนั้นจึงต้องมีจุดเข้าใช้งานบางจุด หาก regsvr32 ล้มเหลว DLL จะไม่มีจุดเข้าใช้งานเหล่านั้นและ DLL ไม่มีคอมโพเนนต์ COM

คุณมีโอกาสเดียวในการใช้ DLL คือการนำเข้าเช่นเดียวกับไบนารีอื่น ๆ ที่ไม่ใช่ NET เช่นเมื่อคุณใช้ Win32 API บางตัว มีบทความนิตยสาร MSDN เก่าที่อาจเป็นประโยชน์ ดูการอัปเดตต่อไปนี้สำหรับข้อมูลที่จะรับบทความ

อัปเดต 12 มีนาคม 2018:ลิงก์ไปยัง MSDN Magazine ไม่สามารถใช้งานได้เหมือนเดิมอีกต่อไปในเดือนสิงหาคม 2010 บทความโดย Jason Clark มีชื่อว่า ".NET Column: Calling Win32 DLLs in C # with P / Invoke" ได้รับการตีพิมพ์ในนิตยสาร MSDN ฉบับเดือนกรกฎาคม 2010 "เครื่อง Wayback" มีบทความที่นี่ในขณะนี้ (การจัดรูปแบบมีข้อ จำกัด ) นิตยสาร MSDN ฉบับเดือนกรกฎาคม 2010 ทั้งหมดมีให้ที่นี่ (รูปแบบ HCM เท่านั้นคำแนะนำเกี่ยวกับวิธีใช้ไฟล์ HCM ที่นี่ )


มีวิธีตรวจสอบให้แน่ใจว่าคอมไพเลอร์ใส่. dll ในโฟลเดอร์ผลลัพธ์แม้ว่าจะไม่ใช่ข้อมูลอ้างอิงหรือไม่?
Kyle Delaney

1
@KyleDelaney ฉันไม่คิดว่าคอมไพเลอร์จะทำได้ ฉันจะพิจารณาใส่คำสั่ง copy หรือ xcopy ลงในเหตุการณ์ pre-build / post-build ของ project / solution แม้ว่าจะเป็นแบบแมนนวล แต่โดยทั่วไปการอ้างอิงจะไม่เปลี่ยนแปลงบ่อยเกินไปและชุดทดสอบที่เหมาะสมควรจับกรณีที่คุณลืมอัปเดตคำสั่งที่ดำเนินการในเหตุการณ์ก่อนสร้าง / หลังการสร้าง
Manfred

ขอบคุณสำหรับการตอบกลับ!
Kyle Delaney

ลิงก์ไปยังบทความตาย
Roald

@Roald ขอบคุณครับ ใช่ลิงค์เสียแน่นอน Microsoft จัดเตรียมรูปแบบ HCM ของนิตยสาร MSDN ทั้งหมดที่ URL อื่นเท่านั้น Wayback Machine ยังมีภาพรวมของบทความในรูปแบบ HTML พร้อมรูปลักษณ์ที่เรียบง่าย ฉันได้อัปเดตคำตอบเพื่อแสดงถึงสิ่งนี้และฉันก็ลบลิงก์ที่เสียออกจากคำตอบของฉันด้วย หวังว่านี่จะช่วยได้
Manfred

12

ฉันใช้วอล์กเกอร์การพึ่งพาเพื่อตรวจสอบการอ้างอิงภายในที่ dll มีอยู่ ปรากฎว่ามันต้องการ VB runtime msvbvm60.dll และเนื่องจากกล่อง dev ของฉันไม่มีการติดตั้งฉันจึงไม่สามารถลงทะเบียนโดยใช้ regsvr32

นั่นดูเหมือนจะเป็นคำตอบสำหรับคำถามเดิมของฉันในตอนนี้


ในกรณีของฉันฉันต้องลบโฟลเดอร์ obj สำหรับโปรเจ็กต์ที่ฉันพยายามอ้างอิงจากนั้นฉันก็สร้างโปรเจ็กต์ใหม่
Tolu

7

ตรวจสอบให้แน่ใจว่าคอมไพเลอร์ของคุณตั้งค่าเป็น x86 หากคุณพยายามอ้างอิง x86 dll ...

ฉันประสบปัญหาที่คล้ายกัน ... ดังที่กล่าวไว้ข้างต้นพยายามใช้ OLEDB เพื่อเข้าถึงไฟล์ Excel จากรหัส C # ของฉันใน Visual Studio 2012

ฉันได้รับข้อผิดพลาดเกี่ยวกับไลบรารี Access ที่ไม่สามารถเข้าถึงได้ แต่ฉันรู้ว่าฉันได้โหลดแล้ว

ในระหว่างการดีบักฉันคิดว่าฉันกำลังรวบรวม 64 บิต แต่โหลด Office x86 แล้ว แม้ว่าฉันจะโหลดไลบรารี Access เป็น 32 บิต แต่แอปก็ไม่เคยใช้งานเลย ... ดังนั้นจึงไม่สามารถเข้าถึงได้

นี่คือสิ่งที่ฉันใช้ใน C #:

"ผู้ให้บริการ = Microsoft.ACE.OLEDB.12.0; แหล่งข้อมูล =" + strFilePath + "; Extended Properties = 'Excel 12.0 Xml; HDR = ใช่'";

... ฉันได้รับข้อผิดพลาด

ทันทีที่ฉันเปลี่ยนคอมไพเลอร์เป็น x86 มันใช้งานได้


2

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


2

ฉันมีปัญหาเดียวกันกับการนำเข้า WinSCard.dll ในโครงการของฉัน ฉันจัดการกับการนำเข้าโดยตรงจาก dll ดังนี้:

[DllImport("winscard.dll")]
public static extern int SCardEstablishContext(int dwScope, int pvReserved1, int pvReserved2, ref int phContext);

[DllImport("winscard.dll")]
public static extern int SCardReleaseContext(int phContext);

คุณสามารถเพิ่มสิ่งนี้ลงในโปรเจ็กต์แยกจากนั้นเพิ่มการอ้างอิงจากโปรเจ็กต์หลักของคุณ


1

ฉันมีปัญหานี้หลังจากที่พีซีของฉันถูกรีสตาร์ทในระหว่างการสร้างโซลูชัน การอ้างอิงสองรายการของฉันหายไปดังนั้นฉันจึงต้องสร้างทั้งสองโปรเจ็กต์ใหม่ด้วยตนเองจากนั้นฉันสามารถเพิ่มการอ้างอิงได้โดยไม่มีข้อผิดพลาด


1

คุณไม่สามารถเพิ่มการอ้างอิงไปยังDLL ดั้งเดิมได้ อย่างไรก็ตามคุณสามารถรวมไว้ในโซลูชัน (โซลูชันคลิกขวาเลือก "เพิ่มไฟล์ที่มีอยู่") แต่จะไม่มีการอ้างอิงเว้นแต่คุณจะประกาศบางสิ่งเช่น

[DllImport("...")]
public static extern void MyFunction();

บางทีอาจมีWrapper DLL บางชนิดซึ่งคุณกำลังอ้างอิงอยู่และมีการนำเข้า DLL

บางครั้งคุณอาจอ้างอิง Wrapper DLL แต่ยังไม่สามารถทำให้โปรแกรมของคุณทำงานได้โดยที่ error prompt จะแนะนำให้คุณแน่ใจว่ามีไฟล์อยู่และมีการอ้างอิงทั้งหมด

ปัญหานี้เป็นเพราะแอสเซมบลีที่คุณพยายามเพิ่มนั้นถูกกำหนดเป้าหมายและคอมไพล์สำหรับสถาปัตยกรรมตัวประมวลผลx86หรือx64เท่านั้น

เพียงแค่ลองเปลี่ยนแพลตฟอร์มเป้าหมายเพื่อx86หรือx64ในรูปร่าง -> Configuration Manager


1

ฉันต้องการที่จะเปลี่ยนแปลงสถาปัตยกรรม x86 จาก x64 ในการจัดการการตั้งค่าและคัดลอก 32 บิต dll (ภาษา C - pcProxAPI.dll) ของฉันลงในโฟลเดอร์ใหม่ที่สร้างขึ้นนี้ .. นี่คือด้านบนของขั้นตอนที่อธิบายด้วย "Sashus" ด้านล่าง

C: \ Projects .. \ bin \ x86 \ Debug


นี่เป็นปัญหาสำหรับฉันเช่นกัน
rogue39nin

แต่ถ้าค่าเริ่มต้นไม่ใช่ x86 หรือ x64? แต่ .... "Cpu ใด ๆ " ปรากฏขึ้น ... ?
gumuruh

codeproject.com/articles/1160645/… cpu ใด ๆ ก็อาจทำงานได้เช่นกันหากคุณคัดลอก dll 32 บิตที่นั่น
boateng

1

ฉันมีปัญหาเดียวกันเมื่อฉันพยายามเพิ่ม dll ที่ฉันเพิ่งเข้ารหัสใน C ++ ลงในโครงการ C # ใหม่ของฉัน ปรากฎว่าฉันต้องการตั้งค่าคุณสมบัติของโครงการ C ++ dll ของฉันมาจาก:

  • Configuration Properties\General\Common Language Runtime Support: /clr
  • Configuration Properties\C/C++\General\Common Language RunTime Support: /clr

เนื่องจากโปรเจ็กต์ C # ที่ฉันต้องการใช้ dll นี้ก็ถูกตั้งค่าแบบนั้นเช่นกัน (มีคุณสมบัติเดียวกันตั้งค่าเป็น/clr)


Solution Explorer> Propertise> Configuration Propertise
Yuresh Karunanayake

@gumuruh ถ้าคุณหมายถึง "clr คืออะไร" CLR คือdocs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk

0

ฉันประสบปัญหาที่คล้ายกัน ฉันพยายามเพิ่มการอ้างอิงของ. net 2.0 dll ไปยังโครงการ. Net 1.1 เมื่อฉันพยายามเพิ่ม. dll เวอร์ชันก่อนหน้าซึ่งเป็นไปตาม. Net 1.1 มันได้ผลสำหรับฉัน


0

สำหรับใครก็ตามที่ต้องการความช่วยเหลือในเรื่องนี้หรือประสบปัญหา FileNotFoundException หรือ FirstChanceException โปรดดูคำตอบของฉันที่นี่:

มีโอกาสเกิดขึ้นครั้งแรกประเภท 'System.IO.FileNotFoundException' ใน mscorlib.ni.dll - Windows Phone

โดยทั่วไปคุณต้องมั่นใจอย่างแน่นอนว่าคุณมีคุณสมบัติตรงตามข้อกำหนดทั้งหมดสำหรับการอ้างอิง - ฉันรู้ว่านี่เป็นคำตอบที่ชัดเจน แต่คุณอาจมองข้ามข้อกำหนดที่ค่อนข้างง่าย


พิจารณาความแตกต่างระหว่างเวอร์ชันของเฟรมเวิร์กที่เกี่ยวข้องกับการอ้างอิง - โดยมากแล้วการใช้เวอร์ชันเฟรมเวิร์กที่ใหม่กว่าไม่ควรสร้างความแตกต่าง
JHaps

0

ฉันมีข้อผิดพลาดนี้ขณะเขียนบริการ Windows ฉันใช้ Visual Studio ในฐานะผู้ดูแลระบบเพื่อให้คำสั่ง post build ของฉันติดตั้งบริการของฉันโดยอัตโนมัติ ฉันสังเกตว่าเมื่อฉันปิดทุกอย่างและเรียกใช้ VS ตามปกติ (ไม่ใช่ในฐานะผู้ดูแลระบบ) มันให้ฉันเพิ่มการอ้างอิงได้ดีโดยไม่มีข้อผิดพลาด

หวังว่าโซลูชันนี้จะเหมาะกับคุณ


0

โดยปกติใน Visual Studio 2015 คุณควรสร้างโครงการ dll เป็นโครงการ C ++ -> CLR จากเทมเพลตของ Visual Studio แต่ในทางเทคนิคคุณสามารถเปิดใช้งานได้หลังจากข้อเท็จจริง:

คุณสมบัติที่สำคัญถูกเรียกว่าCommon Language Runtime Supportset ในคอนฟิกูเรชันของโปรเจ็กต์ของคุณ อยู่ใต้Configuration Properties > General > Common Language Runtime Support.

เมื่อทำเช่นนี้ VS อาจไม่อัปเดตตัวเลือก 'Target .NET Framework' (อย่างที่ควรจะเป็น) คุณสามารถเพิ่มสิ่งนี้ด้วยตนเองโดยการยกเลิกการโหลดโปรเจ็กต์ของคุณแก้ไขไฟล์ your_project.xxproj และเพิ่ม / อัปเดตTarget .NET framework Versionแท็ก XML

สำหรับตัวอย่างฉันขอแนะนำให้สร้างโซลูชันใหม่เป็นโปรเจ็กต์ C ++ CLR และตรวจสอบ XML ที่นั่นบางทีอาจแตกต่างกันเพื่อให้แน่ใจว่าไม่มีอะไรสำคัญมากที่ผิดปกติ


0

คำตอบของฉันค่อนข้างช้า แต่เพื่อเป็นการทดสอบอย่างรวดเร็วตรวจสอบให้แน่ใจว่าคุณใช้ไลบรารีเวอร์ชันล่าสุด

ในกรณีของฉันหลังจากอัปเดตไลบรารี nuget ที่อ้างถึงไลบรารีอื่นทำให้ปัญหาหายไป


0

คุณสามารถเพิ่มไฟล์. dll ได้ด้วยตนเอง ตัวอย่างเช่นหากคุณต้องการเพิ่มไฟล์ dll ในแอปพลิเคชัน WPF ของคุณและคุณไม่สามารถอ้างอิงได้ในโครงการของคุณ

(รับข้อผิดพลาด: ไม่สามารถเพิ่มการอ้างอิงถึง ".... dll" ได้โปรดตรวจสอบให้แน่ใจว่าไฟล์สามารถเข้าถึงได้และเป็นแอสเซมบลีหรือคอมโพเนนต์ COM ที่ถูกต้อง)

จากนั้นคัดลอกไฟล์ dll นั้นและวางใน INSTALLER PROJECT (ในโฟลเดอร์แอปพลิเคชัน)


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.