I tried what you suggested but it didn't work. I think I might have missed
something.
I created a test class and a test method in "identity.cs"
(system\runtime\remoting), with the following code:

public class GCManager2
{
    public int counter;
    public Hashtable testTable = new Hashtable( );
    public GCManager2( )
    {
        counter = 0;
    }

    public void Go( )
    {
        testTable.Add( counter.ToString(), counter );
        counter++;
    }
}

Then I added the following lines to "mscorlib.h":

DEFINE_CLASS(GC_MANAGER_2, Remoting, GCManager2)
DEFINE_METHOD(GC_MANAGER_2, GC_GO, Go, IM_RetVoid)

Then in "comutilnative.cpp" I included mscorlib.h and added the following
lines between the helper frames
in GCInterface::CollectGeneration:

MethodDesc *pMD = g_Mscorlib.GetMethod(GC_GO);
pMD->Call(GC_GO);

But when I build Rotor I get an error message because GC_GO is an unknown
identifier.

Where did I go wrong?

Thanks again for any help,

Ricardo Mendes
Distributed Systems Group
INESC-ID Lisbon, Portugal


----- Original Message -----
From: "Jan Kotas" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, July 07, 2003 4:36 PM
Subject: Re: [DOTNET-ROTOR] When to call code after the GC


> MethodDesc::Call is used in the EE itself to call the managed code. Here
> is an example from comutilnative.cpp:
>
>         MethodDesc *pMD =
> g_Mscorlib.GetMethod(METHOD__EXCEPTION__GET_MESSAGE);
>
>         ARG_SLOT GetMessageArgs[] = { ObjToArgSlot(objException) };
>         MessageString =
> (STRINGREF)ArgSlotToObj(pMD->Call(GetMessageArgs,
> METHOD__EXCEPTION__GET_MESSAGE));
>
>
> In order to call your own method from the EE code, you need to add an
> entry in clr\src\vm\mscorlib.h. Entry in mscorlib.h will give you the
> METHOD__XXX constant. If your method has unusual signature, you may also
> need to add an entry to clr\src\vm\metasig.h in order to complete the
> entry in mscorlib.h.
>
> MethodDesc::Call should be used inside
> HELPER_METHOD_FRAME_BEGIN/HELPER_METHOD_FRAME_END since it needs a valid
> frame to be erected.
>
> If your method is not in mscorlib, I would recommend adding a small
> method to mscorlib that will call your non-mscorlib method. Check
> LoadISymWrapper method in
> clr\src\BCL\System\Reflection\Emit\AssemblyBuilder.cs to see how to do
> it.
>
> -Jan
>
> This posting is provided "AS IS" with no warranties, and confers no
> rights.
>
> -----Original Message-----
> From: Discussion of the Rotor Shared Source CLI implementation
> [mailto:[EMAIL PROTECTED] On Behalf Of Ricardo Mendes
> Sent: Monday, July 07, 2003 8:13 AM
> To: [EMAIL PROTECTED]
> Subject: [DOTNET-ROTOR] When to call code after the GC
>
> Hello all,
>
> What is the best place to call managed code after a GC? I tried to call
> managed code after the
> HELPER_METHOD_FRAME_END(); call in the
> FCIMPL1(void, GCInterface::CollectGeneration, INT32 generation) method
> (in
> the comutilnative.cpp file)
> but it just keeps on firing assertions. I want to call managed code
> using
> something like FFI. It would be great
> to call the code I want from managed code but I don't know if it's
> possible.
> Any ideas regarding a place in which I can call managed code safely
> after a
> GC?
>
> Thanks in advance for any help...
>
> Ricardo Mendes
> Distributed Systems Group
> INESC-ID Lisbon, Portugal
>

Reply via email to