Поделиться через


Использование замещающего упаковщика

После создания упаковщика его можно применять в качестве настраиваемой оболочки для конкретного типа. В следующем примере показано определение управляемого интерфейса IUserData:

Public Interface IUserData
    Sub DoSomeStuff(pINew As INew)
End Interface
public interface IUserData {
    void DoSomeStuff(INew pINew);
}

В следующем примере интерфейс IUserData использует упаковщик NewOldMarshaler, чтобы разрешить неуправляемым клиентам передавать интерфейс IOld методу DoSomeStuff. Управляемое описание метода DoSomeStuff принимает интерфейс INew (как показано в предыдущем примере), в то время как неуправляемая версия DoSomeStuff принимает интерфейс IOld (как показано в следующем примере).

Представление библиотеки типов

[uuid(9B2BAADA-0705-11D3-A0CD-00C04FA35826)]
library UserLib {
     [uuid(9B2BABCD-0705-11D3-A0CD-00C04FA35826)]
     interface IUserData : IUnknown
         HRESULT DoSomeStuff(IUnknown* pIOld);
}

Библиотека типов, созданная путем экспорта управляемого определения IUserData, вместо стандартного определения предоставляет неуправляемое определение, показанное в этом примере. Атрибут MarshalAsAttribute, примененный к аргументу INew в управляемом определении метода DoSomeStuff, показывает, что этот аргумент использует настраиваемый упаковщик, как показано в следующем примере:

Imports System.Runtime.InteropServices

Public Interface IUserData
    Public Sub DoSomeStuff( _
        <MarshalAs(UnmanagedType.CustomMarshaler, _
        MarshalType := "MyCompany.NewOldMarshaler")> pINew As INew)
    End Sub
End Interface
using System.runtime.InteropServices;

public interface IUserData {
    void DoSomeStuff(
        [MarshalAs(UnmanagedType.CustomMarshaler,
             MarshalType="MyCompany.NewOldMarshaler")]
        INew pINew
    );
}

Атрибут MarshalAsAttribute, используемый для задания настраиваемого упаковщика, принимает два следующих именованных параметра:

  • MarshalType (обязательный).

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

    ПримечаниеПримечание

    Можно использовать поле MarshalTypeRef вместо поля MarshalType.Тип, принимаемый полем MarshalTypeRef, проще задать.

  • MarshalCookie (необязательный)

    Файл "cookie", передаваемый настраиваемому упаковщику. С помощью файла "cookie" можно предоставить упаковщику дополнительные сведения. Например, если один и тот же упаковщик предоставляет нескольких разных оболочек, файл "cookie" может использоваться для указания конкретной оболочки. Файл "cookie" передается методу GetInstance упаковщика.

См. также

Основные понятия

Пользовательский маршалинг

Определение типа маршалинга

Реализация интерфейса ICustomMarshaler