2013-07-24 1 views
1

.NET 2.0을 사용하여 C# COM 클래스를 작성하여 IActiveScriptParse32 인터페이스를 구현했습니다. RegAsm.exe를 사용하여 TLB 파일을 생성 할 때 EXCEPINFO 구조를 포함하는 인터페이스 메서드는 내보내지지 않습니다. RegAsm.exe가 EXCEPINFO 구조를 내보내는 이유는 무엇입니까?RegAsm.exe가 EXCEPINFO 구조체를 내 보내지 않습니다.

인터페이스 및 클래스 선언 :

는 RegAsm.exe이 경고를 생성
using System.Runtime.InteropServices; 
using ComTypes = System.Runtime.InteropServices.ComTypes;   

namespace ScriptEngine 
{ 
    [Guid("BB1A2AE2-A4F9-11cf-8F20-00805F2CD064")] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    public interface IActiveScriptParse32 
    { 
     void InitNew(); 
     void AddScriptlet([MarshalAs(UnmanagedType.LPWStr)] string defaultName, 
          [MarshalAs(UnmanagedType.LPWStr)] string code, 
          [MarshalAs(UnmanagedType.LPWStr)] string itemName, 
          [MarshalAs(UnmanagedType.LPWStr)] string subItemName, 
          [MarshalAs(UnmanagedType.LPWStr)] string eventName, 
          [MarshalAs(UnmanagedType.LPWStr)] string delimiter, 
          IntPtr sourceContextCookie, 
          uint startingLineNumber, 
          ScriptTextFlags flags, 
          [MarshalAs(UnmanagedType.BStr)] out string name, 
          out ComTypes.EXCEPINFO exceptionInfo); 
     void ParseScriptText([MarshalAs(UnmanagedType.LPWStr)] string code, 
          [MarshalAs(UnmanagedType.LPWStr)] string itemName, 
          [MarshalAs(UnmanagedType.IUnknown)] object context, 
          [MarshalAs(UnmanagedType.LPWStr)] string delimiter, 
          IntPtr sourceContextCookie, 
          uint startingLineNumber, 
          ScriptTextFlags flags, 
          out object result, 
          out ComTypes.EXCEPINFO exceptionInfo); 
    } 


    [ComVisible(true)] 
    [Guid("70C3474B-CFE3-4CBB-89F3-E9C70386BCB5")] 
    public class MyScriptParser : IActiveScriptParse32 
    { 
     // Other interface methods 

     public void ParseScriptText(string code, string itemName, object context, string delimiter, IntPtr sourceContextCookie, uint startingLineNumber, ScriptTextFlags flags, out object result, out ComTypes.EXCEPINFO exceptionInfo) 
     { 
      //Code 
     } 
    } 
} 

:

유형 라이브러리 수출 경고 처리 'ScriptEngine.IActiveScriptParse32을. ParseScriptText (exceptionInfo), MyScriptParser '입니다. 경고 : 비 COM 표시 값 형식 'System.Runtime.InteropServices.ComTypes.EXCEPINFO'는 현재 내보내고있는 형식 또는 기본 형식 인 중 하나에서 참조 된 입니다.

그리고이 선언과 .TLB 파일 생성

[ 
    odl, 
    uuid(BB1A2AE2-A4F9-11CF-8F20-00805F2CD064), 
    version(1.0), 
    oleautomation, 
    custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "ScriptEngine.IActiveScriptParse32") 
] 
interface IActiveScriptParse32 : IUnknown { 
    HRESULT _stdcall InitNew(); 
}; 

답변

1

그것은 그것이 말하는 것처럼이다는 ComTypes.EXCEPINFO 구조는 [대해 ComVisible (사실)] 속성이 없습니다. 이것은 의도적이었습니다. 이것은 경고 일 뿐이며 오류는 아닙니다.

[ComVisible] C# 코드에서 생성 한 형식 라이브러리에는 항상 stdole2.tlb가 포함되므로 의도적 인 것입니다. IDispatch 및 사용되는 구조와 같은 모든 공용 자동화 유형을 선언하는 표준 형식 라이브러리입니다.

이것은 Oleview.exe에서 볼 수있는 것입니다. Visual Studio 명령 프롬프트에서 실행하고 File + View Typelib을 사용하여 형식 라이브러리를 선택합니다. 아직 사용하지 않는 경우 Tlbexp.exe를 사용하십시오. 당신은 상단이 있으며, 형식 라이브러리에서 디 컴파일 된 IDL를 볼 수 있습니다 :

// TLib :  // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046} 
importlib("stdole2.tlb"); 

지금 파일 +보기 TypeLib의를 사용하여 C 선택 : \ system32를 \ stdole2.tlb을 \ WINDOWS를. 거기에 EXCEPINFO가 선언되어 있습니다.

또는 다른 말로하면, 유형 라이브러리를 읽는 도구는 항상 EXCEPINFO에 대한 선언을 갖습니다. Regasm.exe는 그 사실을 깨닫기에 현명하지 못하며 가져온 형식 라이브러리를 보지 않습니다.

기술적으로 "stdole"에 대한 참조를 추가하여 경고를 억제 할 수 있습니다. .NET 탭에서 볼 수 있습니다. 대신 코드에 stdole.EXCEPINFO을 사용하십시오. 이것은 타입 라이브러리에 EXCEPINFO의 정의를 넣을 것입니다. 당신이 사용하는 도구에서 무슨 일이 일어날 지 정확히 알지 못한다면 두 개의 EXCEPINFO에 대한 정의를 볼 때 형식 라이브러리를 읽으므로 그렇게하지 않는 것이 낫습니다. 그냥 경고를 무시하십시오.

관련 문제