рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ
рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рдерд╛ рдХрд┐ рдХреИрд╕реЗ рдЖрдк COM рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ, рд╕реА ++ / рд╕реАрдПрд▓рдЖрдИ, рдЖрджрд┐ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рднреА .NET рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рд╢реБрджреНрдз C ++ рдореЗрдВ рд▓рд┐рдЦреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЬ рдореИрдВ рдПрдХ рдФрд░ рдореВрд▓ рдФрд░ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛, рдФрд░, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╡рд┐рд╖рдп рдЙрди рд╕рднреА рд╣реЗрдмреНрд░рдЯрд┐рдХреА рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдкреА рдХрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЕрджреНрднреБрдд рдЙрдкрдХрд░рдг
рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдкреНрд░рд╡реЗрд╢ (рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдпрд╣ рд╡рд┐рд╖рдп рд╣рдм рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЪрд▓реЛ C ++ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдФрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдПрдХ
рд╣реА рдкреБрд░рд╛рдирд╛ рдЖрд╡реЗрджрди рд▓реЗрддреЗ рд╣реИрдВред
рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рдкреБрд░рд╛рдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓реЗрдВ рдФрд░ COM рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдХрдЪрд░реЗ рдХреЛ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо HRESULTs, GUID, рдФрд░ рдЕрдиреНрдп рдмреБрд░реА рдЖрддреНрдорд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдПрдВрдЧреЗ, рдЬрд┐рдирдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛, рдЪрд╛рд░реЛрдВ рдУрд░ рд▓реМрдЯ рд░рд╣реЗ рд╣реИрдВред рдХреЛрдб рддреБрд░рдВрдд рд▓рдЧрднрдЧ рдЖрдзрд╛ рд╣реЛ рдЧрдпрд╛ :) рдЬрд┐рддрдирд╛ рд╣реЛ рд╕рдХреЗ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рдбрд┐рд╕реНрдкреЛрдЬрд╝ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдореБрдХреНрдд рдХрд░ рджреЗрдЧрд╛ред
рддреЛ, рд╣рдорд╛рд░рд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ C ++ рд╡рд░реНрдЧ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
class CHello
{
public :
LIBCALL Dispose()
{
delete this ;
}
LIBCALL SetName(LPWSTR AName)
{
mName = AName;
}
LIBCALL Say(HWND AParent)
{
wstring message = L "Hello, my friend " + mName;
MessageBox(AParent, message.c_str(), L "From C++" , MB_ICONINFORMATION);
}
private :
wstring mName;
};
рдпрд╣рд╛рдБ LIBCALL == рд╡рд░реНрдЪреБрдЕрд▓ рд╢реВрдиреНрдп __stdcall
рдЪрд▓реЛ C # рднрд╛рдЧ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рд╡рд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдирд┐рд░реНрдпрд╛рдд рдХреА рдЧрдИ C ++ рд╡рд░реНрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХреНрд░рдо рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ):
[InvokerObject(EObjectType.Hello)]
public interface IHello : IDisposable
{
void SetName([MarshalAs(UnmanagedType.LPWStr)] string AName);
void Say( IntPtr AParent);
}
рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЖрдИрдбреАрд╕реЙрд░реЛрдкреА рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдкрд╣рд▓реА рд╡рд┐рдзрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдбрд┐рд╕реНрдкреЛрдЬрд╝ рд╡рд┐рдзрд┐ рд╣реЛрдЧреАред InvokerObject рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдФрд░ рдмрддрд╛рдКрдВрдЧрд╛ред
рдЕрдм, рдПрдХ C # рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╣рдорд╛рд░реА C ++ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рд▓рд┐рдЦреЗрдВ :
IHello hello = Invoker.Create<IHello>();
hello.SetName(txtName.Text);
hello.Say(Handle);
рдХреЛрдб рд╕реЗ рдкрд░реЗ
рдЕрдм, рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рд╕рдм рдЕрдВрджрд░ рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдирд╛рдпрдХ рдЖрдЬ CIL opcode
Calli рд╣реИ ред рдпрд╣ рдСрдкрдХреЛрдб рдЖрдкрдХреЛ рджрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдордирдорд╛рдиреЗ рдорд╢реАрди рдкрддреЗ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЙрд╕ рдкрд░ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдЪрд┐рд▓рдорди рдХрд╛ рдкреВрд░рд╛ рдХрд╛рдо рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдЖрд╡рд░рдг рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдкрд░ рд╕рднреА рдХрд╛рд░реНрдп рд╣рдорд╛рд░реЗ рдЗрдирд╡реЙрдХрд░ рдХреНрд▓рд╛рд╕ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рдпрд╣рд╛рдВ рдЗрд╕рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб рдирд╣реАрдВ рджреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд╡рд┐рдЪрд╛рд░ рдФрд░ рдХрд╛рдо рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ (рдЬреЛ рдХреЛрдИ рднреА рдЗрдЪреНрдЫреБрдХ рд╣реИ рд╡рд╣ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд╕рдВрдЧреНрд░рд╣ рджреНрд╡рд╛рд░рд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред
рдЗрдирд╡реЙрдХрд░ рд╡рд░реНрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
- рдПрдХ рдбрд╛рдпрдирд╛рдорд┐рдХ рдЕрд╕реЗрдВрдмрд▓реА рдмрдирд╛рдПрдБ ( AppDomain.CurrentDomain.DefineDynamicAssembly )
- рдЗрд╕ рдЕрд╕реЗрдВрдмрд▓реА рдореЗрдВ рд╣рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ
- рд╣рдо рдЙрд╕ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдирдореИрдиреНрдб рдХреНрд▓рд╛рд╕ рдХреЛ рдПрдХ рдЗрдВрдЯрдкреНрд░рд╛рдЯрд░ рдкреЙрдЗрдВрдЯрд░ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░, рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╡рд░реНрдЪреБрдЕрд▓ рдореЗрдердб рдЯреЗрдмрд▓ рд╕реЗ рдлрдВрдХреНрд╢рди рдПрдбреНрд░реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЦреНрдпрд╛ рдкрдврд╝рддрд╛ рд╣реИред
- рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЬрд╛рддреЗ рд╣реИрдВ
- рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рд╡рд╛рдВрдЫрд┐рдд рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХреИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ C ++ рд╡рд░реНрдЧ рдХреА рдЕрдВрддрд┐рдо рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ
рд╕рд╛рд░ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрд░рд╛рдЪрд┐рдЯреНрд░реА рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рд╡рд░реНрдЧ (рдЪрд░рдг 2 рдФрд░ 3) рдмрдирд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгреА рдХреЛрдб рджреЗрддрд╛ рд╣реВрдВ:
// (+1 .. Dispose)
int k = InterfaceType.GetMethods().Count() + 1;
// unmanaged
typeBuilder = InvokerDynamicAssembly.Instance.Builder.DefineType(TypeName, TypeAttributes.Class | TypeAttributes.Public);
//
typeBuilder.AddInterfaceImplementation(InterfaceType);
//
ptrThis = typeBuilder.DefineField( "ptr" , typeof ( IntPtr ), FieldAttributes.Private);
methods = typeBuilder.DefineField( "methods" , typeof ( IntPtr []), FieldAttributes.Private);
vtbl = typeBuilder.DefineField( "vtbl" , typeof ( IntPtr ), FieldAttributes.Private);
// , VTBL unmanaged
ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { typeof (System. IntPtr ) });
constructorBuilder.DefineParameter(1, ParameterAttributes.In, "Pointer" );
ILGenerator ctorGen = constructorBuilder.GetILGenerator();
//
ctorGen.Emit(OpCodes.Ldarg_0);
ctorGen.Emit(OpCodes.Call, ObjectCtorInfo);
// ptrThis
ctorGen.Emit(OpCodes.Ldarg_0);
ctorGen.Emit(OpCodes.Ldarg_1);
ctorGen.Emit(OpCodes.Stfld, ptrThis);
//
ctorGen.Emit(OpCodes.Ldarg_0);
ctorGen.Emit(OpCodes.Ldarg_1);
ctorGen.Emit(OpCodes.Call, ReadIntPtr); // Marshal.ReadIntPtr
ctorGen.Emit(OpCodes.Stfld, vtbl);
ctorGen.Emit(OpCodes.Ldarg_0);
ctorGen.Emit(OpCodes.Ldc_I4_S, k);
ctorGen.Emit(OpCodes.Newarr, typeof ( IntPtr ));
ctorGen.Emit(OpCodes.Stfld, methods);
//
for ( int i = 0; i < k; i++)
{
ctorGen.Emit(OpCodes.Ldarg_0);
ctorGen.Emit(OpCodes.Ldfld, methods);
ctorGen.Emit(OpCodes.Ldc_I4_S, i);
ctorGen.Emit(OpCodes.Ldarg_0);
ctorGen.Emit(OpCodes.Ldfld, vtbl);
ctorGen.Emit(OpCodes.Ldc_I4, i * IntPtr .Size);
ctorGen.Emit(OpCodes.Add);
ctorGen.Emit(OpCodes.Call, ReadIntPtr);
ctorGen.Emit(OpCodes.Stelem, typeof ( IntPtr ));
}
//
ctorGen.Emit(OpCodes.Ret);
//
AddMethods();
createdType = typeBuilder.CreateType();
рдЕрдм рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ InvokerObjectAttribute рдХреАред рдЗрдирд╡реЙрдХрд░ рд╢реНрд░реЗрдгреА рдХреА рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛:
/// <summary>
///
/// </summary>
/// <returns> </returns>
public static T Create<T>()
where T : class , IDisposable
{
object [] attr = typeof (T).GetCustomAttributes( true );
foreach ( var it in attr)
{
if (it is InvokerObjectAttribute)
{
var objectType = (it as InvokerObjectAttribute).ObjectType;
Invoker inv = new Invoker();
inv.InterfaceType = typeof (T);
inv.Pointer = Lib.CreateObject(objectType);
inv.InitializeType();
return inv.CreateInstance() as T;
}
}
return null ;
}
рдпрд╣рд╛рдВ рд╣рдо InvokerObjectAttribute рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ P \ Invoke Lib рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред CreateObject рд╣рдо C ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рдирдИ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдФрд░ рд╣рдореЗрдВ рдкреЙрдЗрдВрдЯрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд╣рдо рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдкрд╣реБрдВрдЪ рдореЗрдВ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдирдП рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рдж рдореЗрдВ рдПрдХ рдореМрдЬреВрджрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдПрдХ рдирдпрд╛ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
private void InitializeType()
{
if (InvokerDynamicAssembly.Instance.HasType(TypeName))
createdType = InvokerDynamicAssembly.Instance.GetType(TypeName);
else
CreateType();
}
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрдирд╡реЛрдХрд░ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЙрди рддрд░реАрдХреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реИ рдЬреЛ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рдХреЙрд▓ рдХреЛ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
.method public hidebysig virtual
instance void Say (
native int ''
) cil managed
{
// Method begins at RVA 0x2164
// Code size 29 (0x1d)
.maxstack 4
IL_0000: ldarg.0
IL_0001: ldfld native int InvokerDynamicAssembly.net2c.IHello::ptr
IL_0006: ldarg.1
IL_0007: ldarg.0
IL_0008: ldfld native int [] InvokerDynamicAssembly.net2c.IHello::methods
IL_000d: ldc.i4.s 2
IL_000f: nop
IL_0010: nop
IL_0011: nop
IL_0012: ldelem.any [mscorlib]System. IntPtr
IL_0017: calli System.Void(System. IntPtr ,System. IntPtr )
IL_001c: ret
}
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕рд┐рд░реНрдл рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рджрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╡рд╕реНрддреБ рдХреА рдЖрднрд╛рд╕реА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд╛рдн
1. COM рдЗрдВрдЯрд░реЙрдк рд╕реЗ тАЛтАЛрд▓рдЧрднрдЧ 1.6 рдЧреБрдирд╛ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╕реА ++ / рд╕реАрдПрд▓рдЖрдИ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХреА, рдЬреЛ рд▓реЛрдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡реЗ рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
2. MTA \ STA рд╕реЗ рдЕрдирд▓рд┐рдВрдХ рдХрд░рдирд╛ред COM рдЗрдВрдЯрд░реЛрдк рдХреЛ рдереНрд░реЗрдб рдПрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рд╕реНрдЯреЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдЦреНрдд рдкрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдмрд╣реБрдд рдмрд╛рд░ (рдореЗрд░реА рд╕реНрдореГрддрд┐ рдореЗрдВ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛), рдпрд╣ рд╕реА # рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрдИ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЗрд╕ рджреЛрд╖ рд╕реЗ рд░рд╣рд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдХрд┐рд╕реА рднреА рдзрд╛рд░рд╛ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
3. рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рдХреА рдПрдХ рдЫреЛрдЯреА рд░рд╛рд╢рд┐ (рдЧрд┐рдирддреА рдирд╣реАрдВ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЗрдирд╡реЛрдХрд░ рд╡рд░реНрдЧ рдЬреЛ рдПрдХ рдмрд╛рд░ рдФрд░ рд╕рднреА рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИред
рдореБрдЦреНрдп рдиреБрдХрд╕рд╛рди рдореЗрдВ рд╕реЗ - рдореИрдВрдиреЗ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдХрд┐ рдорд╛рд░реНрд╢рд▓реЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ (рдкреВрд░реНрдг рдореИрдиреБрдЕрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╣реА рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╕рдордп, рдкреГрдердХ рдорд╛рд░реНрд╢рд▓рд┐рдВрдЧ рдХреЗрд╡рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ (рдПрдХ рдпреВрдирд┐рдХреЛрдб рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдорд╛рд░реНрд╢рд▓реНрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдкреНрд░рдмрдВрдзрд┐рдд рдХреЛрдб рдореЗрдВ рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд░рдЦрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдЦреНрдд рдкреНрд░рджрд░реНрд╢рди рдЕрдиреБрдХреВрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкреНрд░рдХрд╛рд░ (рд╕рдВрдХреЗрдд рдФрд░ рд╕рдВрдЦреНрдпрд╛) рдХреЗ рдкрд░реНрдпрд╛рдкреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рдореБрдЭреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдмрддрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдмрд╣реБрдд рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдХрд╛рд░реНрдп рдкрд░ рдХрд╛рдлреА рд╕рдордп рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рд╣реИред
PS рдпрджрд┐ рдЖрдк C # рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдХреЗрд╡рд▓ IL рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ:
www.wasm.ru/series.php?sid=22рдкреАрдкреАрдПрд╕ рд╣рд╛рдВ, рдореИрдВ рд▓рдЧрднрдЧ рднреВрд▓ рдЧрдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛, рдореИрдВ рдЗрд╕ рд╕рднреА рдЕрдкрдорд╛рди рдХрд╛ рдкреВрд░рд╛ рд╕реНрд░реЛрдд рд╕рдВрд▓рдЧреНрди рдХрд░ рд░рд╣рд╛
рд╣реВрдВ :
public.66bit.ru/files/2011.10.07/7458c3ca96a60a912020fe049117974fx4/Net2C.rar