dll에 대한 참조를 추가 할 수 없습니다.


95

C # 응용 프로그램에서 .dll 파일을 참조로 추가하면 오류가 표시됩니다.

".... dll"에 대한 참조를 추가 할 수 없습니다. 파일에 액세스 할 수 있고 유효한 어셈블리 또는 COM 구성 요소인지 확인하십시오.

ILDissassembler는 유효한 CLR 헤더가 없다고 말 했으므로 regsvr32를 사용하여 등록하려고하는데 또 다른 오류가 발생합니다.

""모듈이로드되었지만 오류 코드 '0x80004005'로 인해 DLLRegisterServer에 대한 호출이 실패했습니다.

64 비트 Windows 7 컴퓨터에서 VS2010 궁극 버전을 사용하고 있습니다. 무엇이 문제일까요?

힌트 / 답장에 감사드립니다

답변:


53

다음은 나를 위해 일했습니다.

짧은 답변

명령 줄 (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
  • tlbimp.exe의 동일한 폴더에 새 dll이 생성되었습니다. 프로젝트에서 참조로 사용할 수 있습니다.

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

.NET 어셈블리 인 경우에만 프로젝트에 DLL (또는 EXE)을 추가 할 수 있습니다. 그렇지 않은 경우이 오류 메시지가 표시됩니다.

regsvr32는 또한 DLL의 구조 및 내 보낸 기능에 대한 특정 가정을합니다. 내가 그것을 사용한 지 오래되었지만 COM 서버 등록과 관련이 있으므로 특정 진입 점을 사용할 수 있어야합니다. regsvr32가 실패하면 DLL은 이러한 진입 점을 제공하지 않으며 DLL에는 COM 구성 요소가 포함되지 않습니다.

DLL을 사용할 수있는 유일한 기회는 특정 Win32 API를 사용할 때와 같이 다른 비 .NET 바이너리처럼 DLL을 가져 오는 것입니다. 도움이 될 수있는 오래된 MSDN Magazine 기사가 있습니다. 기사를 얻을 수있는 위치에 대한 정보는 다음 업데이트를 참조하십시오.

2018 년 3 월 12 일 업데이트 : MSDN Magazine에 대한 링크는 2010 년 8 월에 사용하던 것처럼 더 이상 작동하지 않습니다. Jason Clark의 기사 제목은 ".NET 열 : P / Invoke를 사용하여 C #에서 Win32 DLL 호출"입니다. MSDN Magazine 2010 년 7 월호에 게시되었습니다. "Wayback Machine"에는 현재 여기 에 기사가 있습니다 (포맷 제한). 전체 MSDN Magazine 2010 년 7 월호는 여기에서 볼 수 있습니다 (HCM 형식 만, 여기에서 HCM 파일 사용 방법에 대한 지침 ).


컴파일러가 참조가 아니더라도 출력 폴더에 .dll을 넣는 지 확인하는 방법이 있습니까?
Kyle Delaney

1
@KyleDelaney 컴파일러가 그렇게 할 수 있다고 생각하지 않습니다. 프로젝트 / 솔루션의 빌드 전 / 빌드 후 이벤트에 복사 또는 xcopy 명령을 넣는 것을 고려할 것입니다. 그러나 수동이지만 일반적으로 참조는 너무 자주 변경되지 않으며 적절한 테스트 스위트는 빌드 전 / 후 빌드 이벤트에서 실행 된 명령을 업데이트하는 것을 잊은 경우를 포착해야합니다.
Manfred

답장을 보내 주셔서 감사합니다!
Kyle Delaney

기사 링크가 죽었습니다.
Roald

@Roald 감사합니다. 예, 링크가 실제로 끊어졌습니다. Microsoft는 다른 URL에서 전체 MSDN Magazine 문제의 HCM 형식 만 제공합니다. Wayback Machine에는 HTML 형식으로 된 기사의 스냅 샷도 일부 단순화 된 모양이 있습니다. 나는 이것을 반영하기 위해 답변을 업데이트했으며 내 답변에서 끊어진 링크도 제거했습니다. 도움이 되었기를 바랍니다.
만프레드

12

dll이 가지고있는 내부 참조를 확인하기 위해 종속성 워커를 사용했습니다. VB 런타임 msvbvm60.dll이 필요했으며 내 dev 상자에 설치되어 있지 않기 때문에 regsvr32를 사용하여 등록 할 수 없었습니다.

그것은 당분간 제 원래 질문에 대한 답인 것 같습니다.


제 경우에는 참조하려는 프로젝트의 obj 폴더를 삭제 한 다음 프로젝트를 다시 빌드해야했습니다.
Tolu

7

x86 dll을 참조하려는 경우 컴파일러가 x86으로 설정되어 있는지 확인하십시오.

위에서 언급했듯이 Visual Studio 2012의 C # 코드에서 Excel 파일에 액세스하기 위해 OLEDB를 사용하려고 시도하면서 비슷한 문제가 발생했습니다.

액세스 라이브러리에 액세스 할 수 없다는 오류가 계속 발생했지만로드했음을 알았습니다.

디버그 중에 64 비트 용으로 컴파일하고 있지만 Office x86이로드되어 있다는 사실이 깨달았습니다. 32 비트 용 Access 라이브러리를로드했지만 앱에서 사용되지 않았기 때문에 액세스 할 수 없었습니다.

다음은 C #에서 사용했던 것입니다.

"Provider = Microsoft.ACE.OLEDB.12.0; Data Source ="+ 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

솔루션을 빌드하는 동안 PC를 다시 시작한 후에이 문제가 발생했습니다. 두 개의 참조가 없어져서 두 개의 프로젝트를 수동으로 다시 빌드해야했고 오류없이 참조를 추가 할 수있었습니다.


1

네이티브 DLL에 대한 참조를 추가 할 수 없습니다 . 그러나 솔루션에 포함시킬 수 있지만 (솔루션을 마우스 오른쪽 버튼으로 클릭하고 "기존 파일 추가"를 선택) 다음과 같이 선언하지 않으면 참조되지 않습니다.

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

실제로 참조하고 DLL 가져 오기를 포함하는 일종의 래퍼 DLL이있을 수 있습니다.

경우에 따라 래퍼 DLL을 참조 할 수 있지만 여전히 프로그램을 실행할 수 없습니다. 오류 메시지는 파일이 있고 모든 종속성을 사용할 수 있는지 확인하라는 메시지를 표시합니다.

이 문제는 추가하려는 어셈블리가 x86 또는 x64 프로세서 아키텍처에 대해서만 대상이되고 컴파일되기 때문 입니다.

빌드 -> 구성 관리자 에서 대상 플랫폼을 x86 또는 x64 로 변경해보세요 .


1

구성 관리자에서 x64에서 x86으로 아키텍처를 변경하고 32 비트 dll (C 언어-pcProxAPI.dll)을 이것이 생성 한 새 폴더에 복사해야합니다. 이것은 아래 "Sashus"에서 설명한 단계 위에 있습니다 .

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


이것은 나에게도 문제였습니다.
rogue39nin 19 년

하지만 기본값이 x86이나 x64가 아니면? 근데 .... "Any Cpu"가 나타 났는데 ...?
gumuruh

codeproject.com/articles/1160645/… 32 비트 dll을 복사하면 모든 CPU가 잘 작동 할 수 있습니다
boateng

1

방금 C ++로 코딩 한 dll을 새 C # 프로젝트에 추가하려고 할 때 동일한 문제가 발생했습니다. 내 dll이 다음과 같은 C ++ 프로젝트의 속성을 설정해야한다는 사실이 밝혀졌습니다.

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

이 dll을 사용하려는 C # 프로젝트도 이와 같이 설정 되었기 때문입니다 (동일한 속성을로 설정했습니다 /clr).


솔루션 탐색기> 속성> 구성 속성
Yuresh Karunanayake

@gumuruh "clr이란 무엇입니까?"를 의미하는 경우 CLR은 docs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk

0

비슷한 문제에 직면했습니다. .net 2.0 dll의 참조를 .Net 1.1 프로젝트에 추가하려고했습니다. .Net 1.1에서 준수 된 .dll의 이전 버전을 추가하려고 할 때. 그것은 나를 위해 일했습니다.


0

이 문제에 대한 도움이 필요하거나 FileNotFoundException 또는 FirstChanceException이 발생하는 다른 사람은 여기에서 내 대답을 확인하십시오.

mscorlib.ni.dll에서 'System.IO.FileNotFoundException'유형의 첫 번째 예외 발생-Windows Phone

일반적으로 참조를 작성하기위한 모든 요구 사항을 충족하고 있다는 것을 절대적으로 확신해야합니다. 이것이 분명한 대답이라는 것을 알고 있지만 비교적 간단한 요구 사항을 간과하고있을 것입니다.


참조와 관련하여 프레임 워크 버전 간의 차이점을 살펴보십시오. 최신 프레임 워크 버전을 사용하는 경우 대부분 차이가 없어야합니다.
JHaps 2015 년

0

Windows 서비스를 작성하는 동안이 오류가 발생했습니다. Visual Studio를 관리자로 실행하여 빌드 후 명령이 내 서비스를 자동으로 설치합니다. 모든 것을 닫고 VS를 정상적으로 실행했을 때 (관리자 권한이 아님) 오류없이 참조를 추가 할 수 있다는 것을 알았습니다.

이 솔루션이 효과가 있기를 바랍니다.


0

일반적으로 Visual Studio 2015에서는 Visual Studio의 템플릿에서 C ++-> CLR 프로젝트로 dll 프로젝트를 만들어야하지만 기술적으로 활성화 할 수 있습니다.

중요 속성은 Common Language Runtime Support프로젝트 구성에서 set 이라고 합니다. 에서 찾을 수 Configuration Properties > General > Common Language Runtime Support있습니다.

이 작업을 수행 할 때 VS는 아마도 '대상 .NET Framework'옵션을 업데이트하지 않을 것입니다. 프로젝트를 언로드하고 your_project.xxproj 파일을 편집하고 Target .NET framework VersionXML 태그를 추가 / 업데이트하여 수동으로 추가 할 수 있습니다 .

샘플의 경우 C ++ CLR 프로젝트로 새 솔루션을 만들고 거기에서 XML을 검사하는 것이 좋습니다. 평범하지 않은 매우 중요한 것이 없는지 확인하기 위해 비교할 수도 있습니다.


0

내 대답은 조금 늦었지만 빠른 테스트로 최신 버전의 라이브러리를 사용하고 있는지 확인하십시오.

제 경우에는 문제를 일으키는 다른 라이브러리를 참조하는 너겟 라이브러리를 업데이트 한 후 문제가 사라졌습니다.


0

.dll 파일을 수동으로 추가 할 수 있습니다. 예를 들어 WPF 애플리케이션에 dll 파일을 추가하고 싶은데 프로젝트에서이를 참조 할 수없는 경우

(Getting error : A reference to the ".... dll"could be added. Please make sure that the file is accessable and that it is valid assembly or COM component),

그런 다음 해당 dll 파일을 복사하고 INSTALLER PROJECT (응용 프로그램 폴더에 있음)에 붙여 넣습니다.


0
  1. cmd.exe를 시작하고 다음을 입력합니다.
  2. Regsvr32 % dllpath %
  3. "% dllpath %"는 dll 경로로 바꿉니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.