2009-05-19 5 views
16

Excel의 VBA에서 사용되는 .NET 2.0 COM 개체가 있습니다. 그것은 내 dev에 기계에서 잘 작동하지만 깨끗한 VM을 워크 스테이션에서이 오류를 사용하려고하면 :Excel .NET COM - 자동화 오류입니다. 지정한 파일을 찾을 수 없습니다.

자동화 오류. 시스템에서 지정된 파일을 찾을 수 없습니다.

dll은 "regasm/tlb/codebase mycom.dll"로 등록되어 있으며 GAC에 포함되어 있지 않습니다. VM 상자에 대한 관리 권한이 없습니다

아이디어가 있습니까?

답변

13

어셈블리의 전체 경로와 함께 regasm을 codebase 매개 변수 값으로 호출하거나 라이브러리 검색을 위해 항상 경로에있는 어셈블리에 어셈블리를 배치해야합니다. 그렇지 않으면 클라이언트가 COM 개체를 인스턴스화 할 때 찾을 수 없습니다.

+0

나는 c : \ temp에있는 어셈블리의 전체 경로에서 regasm을 사용했지만 여전히 동일한 오류가 발생했습니다. – ingt

+1

그런 다음 가장 좋은 방법은 ProcessMonitor를 시작하는 것입니다 - http://technet.microsoft.com /ru-ru/sysinternals/bb896645.aspx - 정확히 어떤 파일이 없는지 살펴보십시오. 그것은 당신이 전혀 모르고있는 어떤 종속 어셈블리 일 수 있습니다. 확실히 알게되면 해결하기가 훨씬 쉬워 질 것입니다. – sharptooth

+1

sharptooth,이 답변에 대해 * 매우 * 많이 감사합니다. 오늘 숨이 막혔어요! –

7

Windows 7, 64 비트 및 Microsoft Excel 2010 VBA 응용 프로그램의 COM 개체로 사용할 수있는 .NET 4.0 프레임 워크 DLL (32 비트)에서는 다음과 같습니다.

  1. 복사 C에 DLL : (../TLB :.) cmd를 쉘에서
  2. syswow64로 \ \ WINDOWS,

당신은 마지막 부분을 건너 뛸 수 있습니다

C:\Windows\Microsoft.NET\Framework\v4.0.<whatever you have>\regasm.exe c:\windows\syswow64\<name of dll> /codebase /tlb:c:\windows\syswow64\<name of dll minus '.dll'>.tlb 
실행 기계에 인텔리 센스를 원하지 않거나 필요하지 않으면 어셈블리를 등록하는 중입니다.

필자는 XP에서/codebase 매개 변수를 사용하지 않아도되는 핵심적인 문제가 있었지만 그 전에는 꼭 필요한 작업이었습니다.

3

VB6 응용 프로그램에서 사용하려는 의도로 .NET .dll (v4.0)을 만든 후에 "자동화 오류, 시스템에서 지정된 파일을 찾을 수 없습니다."오류가 발생했습니다. ClassInterface "및"ComVisible "속성,"ComVisible "이있는 메소드).

"regasm.exe -tlb C : \ PathTo \ MyDll.dll"을 실행했지만 VB6 응용 프로그램에서 .tlb 파일을 참조로 추가하고 실행/디버깅 한 후에 위의 오류가 발생했습니다. regasm.exe 호출에 "-codebase"매개 변수를 추가하고 .tlb 참조를 다시 추가 한 후에 만 ​​오류가 해결됩니다.

그냥 내 경험을 공유한다고 생각했습니다.

0

자동화 오류가 발생합니다. 내 참조 (MS Access에서)는 TLB 파일에 대한 것이 었습니다. 해당 DLL 파일이 TLB 파일을 보유하고있는 폴더에서 누락되어 '자동화 오류'메시지가 나타납니다. 고정 DLL을 다시 추가.

0

원래 오류가 발생한 첫 번째 컴퓨터에서 작업 한 후 동일한 오류 (두 번째 dev 컴퓨터의 레거시 VB6 코드에서 .NET 개체를 소비하지 못했습니다.)가 발생했습니다. .NET DLL을 컴파일하고 등록한 것만으로도 모든 종류의 조합을 시도해 보았습니다. VS에 "Register for COM Interop"빌드 설정을 사용하거나 사용하지 않아도되었습니다. regasm.exe를 통해 수동으로 등록하고/codebase 매개 변수를 사용하거나 사용하지 않고이 작업을 시도하십시오. COM Visible 어셈블리 수준 특성을 설정하고 표시하지 않으려 고 시도했습니다 (억제 할 때 COM에서 소비해야하는 클래스의 특성을 설정 함). 그러나 아무 것도 효과가 없었고 계속 같은 오류가 발생했습니다.

밝혀졌습니다. DLL 출력을 .NET 4로 업그레이드했습니다.5는 두 번째 시스템에서, 원래는 .NET 2.0 어셈블리를 작성하는 반면. 내 프로젝트에는 .NET 2.0을 실행하는 타사 Interop DLL을 대상으로하는 몇 가지 참조가있었습니다. 이 참조를 업데이트하고 DLL을 다시 만들거나 .NET 2.0에서 실행되도록 다시 프로젝트를 설정하면 내 문제가 해결되었습니다./codebase (VS가 자동으로 수행함)를 사용할 때 응용 프로그램 디렉토리 나 \ syswow64에 DLL을 넣을 필요가 없음을 발견했습니다. 또한 MSDN 문서에서는/codebase를 사용할 때 어셈블리에 SN (강력한 이름)을 사용해야한다고 말하지만 사용자는 필요하지 않습니다. regasm.exe 명령 줄 도구에서 경고를받습니다.

요점은 COM Interop 관점에서 보면 대상 .NET Framework에 대한 종속성의 .NET 런타임 버전에주의해야합니다.

관련 문제