2013-05-13 2 views
0

내가 엑셀 ​​상호 운용성을 사용하여 스프레드 시트에서 셀 값을 검색하기 위해 노력하고있어,하지만 난 사용하고 다음 코드는 컴파일러 오류가 생성됩니다 :가져 셀 값 엑셀 Interop를

One or more types required to compile a dynamic expression cannot be found. Are you missing a reference?

Range currentFind = sheet.Cells.Find("some string", Type.Missing, 
        XlFindLookIn.xlValues, XlLookAt.xlPart, 
        XlSearchOrder.xlByRows, XlSearchDirection.xlNext, 
        false, Type.Missing, Type.Missing); 

if (currentFind[1,1].Value != null) 
{ 
    string CellValue = currentFind[1,1].Value.ToString(); 
} 

여기에 무슨 일이 일어나고 있는지 아십니까? 뭔가를 던질 필요가 있을지도 모르겠지만 무엇이 확실하지 않습니다. 나는 currentFind[1,1].Value 캐스팅을 시도했지만 작동하지 않는 것 같습니다.

편집 :

내가 찾은 해결 방법, 기준에 FalseEmbed Interop Types을 설정하지만, 난 여전히 여기에 무슨 방법이 상황을 처리하는 것입니다 무엇을 알고 싶습니다.

+0

을하거나 얻을 않았다 그것의 바닥은 다른 방법으로? 나는 그것을 파악했기 때문에 –

+0

@ Andy- 미안 해요, 난 결코 실현되지 사람이 대답했다. 좋은 정보 주셔서 감사합니다! –

답변

4

당신이 Microsoft.CSharp뿐만 아니라 Microsoft.Office.Interop.Excel에 대한 참조를 추가 한 : currentFind null가 아닌 경우 확인하려고? 과거에이 문제가 해결되었습니다. 예외적으로 유형의 Value 속성을 해결하는 데 필요한 유형 정보가 누락되었습니다. 예외는 일반적으로 누락 된 참조를 제안하려고 시도합니다.

Embed Interop Types에는 어떤 현상이 있습니까?

.NET (C#) 4.0은 dynamic을 소개하고 COM host return object values as the dynamic type을 처리 할 수 ​​있습니다. 이것은 코드를 작성할 때 우리가 원하는 형식으로 반환 객체를 명시 적으로 변환 할 필요가 없으므로 코드 작성시보다 쉽게 ​​사용하기로되어 있습니다. 이 문제는 어셈블리에서 "Interop Types Embedding"이 true으로 설정된 경우 발생합니다. 이는 VS에 추가하는 참조의 기본값이기도합니다.

은 기본적으로 VS 당신이 컴파일시에, 어셈블리에를 사용하는 유형의 PIA의 일부를 내장 (이 좋은 이유에 대한 "what is the advantage of .net4's new no pia feature [deploying PIA's]"에 대한 답을 참조). 그러나이를 수행하려면 참조 트리에서 모든 PIA에 액세스해야합니다.

dynamic은 후기 바인딩을 허용한다. 따라서 귀하의 경우에 Value이 런타임시 해결 될 동적 유형이되어 올바른 어셈블리 및 PIA 참조를 얻을 수 없으므로 잘못된 것입니다. '상호 운용성 유형 포함'을 false으로 설정하면 Value 유형이 object 유형이되어 문제를 방지 할 수 있습니다.하지만 이제는 어느 지점에서 올바른 유형으로 캐스팅해야합니다.

왜 PIA 정보를 포함합니까?

테스트 한 것보다 이전/이후 버전에서 지원되지 않는 기능을 사용하지 않는 한 여러 버전의 Office를 쉽게 배포하고 지원할 수 있습니다. 이것은 쉬운 일이 아닙니다. 제비 뽑기가 잘못 될 수 있습니다.

MSDN - Walkthrough: Office Programming (C# and Visual Basic)이 언급하지만, 좋은 일이라고하는 것이 다른 것보다 큰 거래를하지 않습니다. 예를 들어

는 : 내가 VS2010에서 프로젝트를 해고하고

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Office.Interop.Excel.dll

에있는 VSTO 엑셀 2010 상호 운용성을 참조하는 경우 다음 내가 삽입 상호 운용성의 유형 true로 설정하여이 문제를하지 않는 자동으로 추가로

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\Microsoft.CSharp.dll
도 참고로한다. 나는 다음 Microsoft.CSharp 참조를 제거하면, 나는 컴파일러 오류가 발생하지만, 내가 원래 내 솔루션을 발견하는 방법을 다음과 같은 오류, 상태 : 제공된 답변 중 하나가 귀하의 질문에 대답 했

One or more types required to compile a dynamic expression cannot be found. Are you missing references to Microsoft.CSharp.dll and System.Core.dll?

0

프로젝트에 대한 참조를 추가해야하는 것처럼 보입니다. 가지고있는 다른 코드가 무엇인지 모르지만이 경우 프로젝트에 interop 어셈블리를 추가해야합니다. 편집기에서 오류가있는 행을 표시하고 해당 행에서 사용하는 객체의 유형을 확인하십시오. 나는 다음 줄에 잠재적 인 문제를 참조 보조 노트에

:

if (currentFind[1,1].Value != null)

값이 다음을 찾을 수없는 경우 currentFind가 null로, 당신은 배열처럼 널 (null)에 액세스하려고합니다.

if (currentFind != null) 
+0

그래, 난 이미 프로젝트의 Interop 어셈블리가 있습니다. 당신은 잠재적 인 문제에 대한 맞아,하지만 내가 실행 해요 실제 코드, 그냥 간단한 테스트 케이스가 아닙니다. –