Использование замещающего упаковщика
После создания упаковщика его можно применять в качестве настраиваемой оболочки для конкретного типа. В следующем примере показано определение управляемого интерфейса 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 упаковщика.