Импортер библиотеки типов не смог преобразовать подпись для предупреждения члена в тривиальной установке.

Обратите внимание на этот самый простой IDL-файл:

import "unknwn.idl";

typedef struct _MyStruct
{
  DWORD len;
  [size_is(len)] BYTE *buffer;
} MyStruct;

[
    object,
    uuid(903C11E8-46A0-4E6E-B54C-6619B6A42CCB), 
    pointer_default(unique)
]
interface IMyIntf : IUnknown
{
  [local]
  HRESULT Func([in] MyStruct *pObj);
};
[
    uuid(BAC6289C-503C-4ADD-B27A-4F22D726C109),
    version(1.0),
]
library Lib
{
    importlib("stdole2.tlb");
    [
        uuid(76D40083-C27F-45FB-88DC-C3E7DF9B5988)
    ]
    coclass MyClass
    {
        [default] interface IMyIntf;
    };
};

Вот как я его компилирую:

z:\Work>del 1.tlb

z:\Work>midl  /W1 /nologo /char signed /env win32 /Oicf /tlb "1.tlb" /robust 1.idl
Processing .\1.idl
1.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\unknwn.idl
unknwn.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\wtypes.idl
wtypes.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\basetsd.h
basetsd.h
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\guiddef.h
guiddef.h
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\oaidl.idl
oaidl.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\objidl.idl
objidl.idl
Processing C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\oaidl.acf
oaidl.acf

z:\Work>tlbimp 1.tlb
Microsoft (R) .NET Framework Type Library to Assembly Converter 4.0.30319.1
Copyright (C) Microsoft Corporation.  All rights reserved.

TlbImp : warning TI3016 : The type library importer could not convert the signature for the member 'Lib._MyStruct.buffer'.
TlbImp : Type library imported to Lib.dll

z:\Work>

Обратите внимание на предупреждение TlbImp. Созданная сборка взаимодействия:

namespace Lib
{
    [StructLayout(LayoutKind.Sequential, Pack=4), ComConversionLoss]
    public struct _MyStruct
    {
        public uint len;
        [ComConversionLoss]
        public IntPtr buffer;
    }

    [ComImport, Guid("903C11E8-46A0-4E6E-B54C-6619B6A42CCB"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IMyIntf
    {
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
        void Func([In] ref _MyStruct pObj);
    }

    [ComImport, Guid("903C11E8-46A0-4E6E-B54C-6619B6A42CCB"), CoClass(typeof(MyClassClass))]
    public interface MyClass : IMyIntf
    {
    }

    [ComImport, TypeLibType(TypeLibTypeFlags.FCanCreate), ClassInterface(ClassInterfaceType.None), Guid("76D40083-C27F-45FB-88DC-C3E7DF9B5988")]
    public class MyClassClass : IMyIntf, MyClass
    {
        // Methods
        [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime)]
        public virtual extern void Func([In] ref _MyStruct pObj);
    }
}

Наличие атрибута ComConversionLoss меня расстраивает, поэтому у меня вопрос, как мне избавиться от этого предупреждения?

PS Мой вопрос может показаться точной копией Почему импортер библиотеки типов не смог преобразовать подпись для предупреждений членов?. Однако это не так, потому что я компилирую в командной строке и предупреждение никуда не исчезает.


person mark    schedule 14.07.2011    source источник