2012-06-28 3 views
0

을 사용하여 제대로 함수를 노출하려면 C#에서 관리되지 않는 DLL을 사용하는 컨트롤러와 통신해야합니다. 이 문서는 DLL에별로 도움이되지 않으며 DLL과 이야기 할 때 경험이 없습니다. 이 회사는 VB에서 DLL을 래핑하는 클래스로 샘플 VB 프로젝트를 제공합니다. 클래스는 ctccom32v2라고합니다.VB 클래스 라이브러리에서 C#

구조체 및 기타 변수를 포함하여 관리되지 않는 DLL을 호출하는 더러운 작업이 이미 완료되었으므로 해당 클래스를 사용하여 VB 클래스 라이브러리를 만들 수 있다고 생각했습니다. 나는 그것이 많은 시간과 노력을 덜어 줄 것이라고 생각한다. 그래서 VB 클래스 라이브러리 프로젝트에 클래스 소스 파일을 추가하고 DLL을 빌드 할 때 dll을 생성합니다. 그런 다음 해당 DLL을 C# 프로젝트 참조에 추가하고 참조 브라우저에서 함수를 볼 수 있습니다. 내가 만든 라이브러리의 이름은 CTC_Lib입니다.

는 (난 그냥 VB에서 내 프로그램을 작성하고 자신의 클래스를 사용하지 않는 이유를 궁금해하는 경우, 내가 선호 나는 C#에서 더 편안하고 있어요)

내가으로 실행하고 문제는 이것이다 : 하는 경우 내가 ctc.somefunction를 입력하려고 다음

CTC_Lib.Ctccom32v2 ctc = new CTC_Lib.Ctccom32v2(); 

등을 사용하여 라이브러리의 인스턴스를 생성, 인텔리 등 같음, GetHashCode, 같은 몇 가지 기본 방법을 내가 관리되지 않는를 드러내는 Ctccom32v2의 함수를 볼 수 없습니다를 보여줍니다 DLL. 내가 지금처럼 수동으로 라이브러리 및 클래스 이름을 입력하면

는 :

CTC_Lib.Ctccom32v2. 

IntelliSense를 목록 Ctccom32v2의 모든 기능과 함께 나타납니다.

Public Function add() as Void 
Return 1+2; 
End Function 

내가 다음 인스턴스를 만들기 위해 같은 방법을 사용하십시오 :

나는 VB 클래스 라이브러리에 다른 클래스를 추가하면 그것으로 간단한 기능과 스틱 ("somelib"를 호출 수 있습니다)

CTC_Lib.somelib ctc = new CTC_Lib.somelib(); 

"add"기능은 이제 ctc를 입력하기 만하면 intellisense 창에 나타납니다.

함수가 VB 클래스에서 선언되는 방식 때문일 수 있습니까?

Declare Auto Function CtOpenConnection Lib "Ctccom32v2.dll" _ 
    (ByVal ConnectID As Integer, ByVal CommPort As Integer, ByVal Address As Integer) As Integer 

난 당신이 시도 할 때 그 기능을 노출하지 않고 무엇을 의미하는지 자동 기능 모른다 : 여기 VB 클래스의 많은 기능 중 하나입니다, 그들은 모두 같은이 "자동 기능을 선언"을 사용하여 선언 이 클래스가 상주하는 클래스의 인스턴스를 만들 수 있습니다.

VB 클래스 라이브러리 내의 해당 함수를 호출하는 적절한 방법이 아니면 초보자입니다. 또한 내 용어의 일부가 틀린 경우 용서해주십시오. 나는 전문 용어 프로그래밍에 익숙하지 않다 (아직).

답변

0

관리되지 않는 DLL에 함수에 대한 정보를 올바르게 표시하는 데 필요한 메타 데이터가 없으므로 두 시나리오에서 인텔리 센스가 다릅니다. VB 함수 에 해당 메타 데이터를 가지고 있습니다.

이미 해결 방법을 알고 있습니다. 라이브러리 및 클래스 이름을 수동으로 입력하십시오. 또는 관리되지 않는 함수를 관리되는 VB 메서드로 래핑하여 인텔리 센싱에 필요한 메타 데이터를 제공 할 수 있습니다.

+0

감사합니다. 나는 인텔리 센스가 기능을 "보지"못했다면 뭔가 잘못되었을 수 있다고 생각했습니다. –

0

Declare statement에있는 MSDN 설명서를 참조하십시오. 이것은 C#에서 extern 메서드를 선언하는 것과 유사합니다. 내가 누락 된 것은 접근 수정 자다. 선언 된 바깥에서 사용할 수 있도록하려면 Public Declare ...과 같아야합니다.

문제가 아닌 경우 DllImport을 사용하여 공개 클래스에서 Public Shared Function으로 선언 할 수 있습니다. 예를 들어 Declare statement doc 하단에 표시됩니다.

아마도 이것과 C#/VB 변환에 대해서도 어셈블리를 디 컴파일하여 ILSpy으로 만들고이 줄로 인해 생성되는 내용을 확인하는 것이 유용 할 수 있습니다.

+0

정보를 주셔서 감사합니다, 나는 "Declare Auto Function"앞에 Public을 넣으려고했지만 intellisense에서는 아무것도 사용하지 않았습니다. –

관련 문제