AHA! Okay, Jan, five Duke Dollars.... uh.... Redmondian Rupees, I mean....
to you. :-) In particular, I'm bummed because I looked at this line four
times and didn't realize what it (I think) implies:

ceemain.cpp: 592 (in ClrCreateManagedInstance):

        pClass = pDomain->FindAssemblyQualifiedTypeHandle(pName,
                                                          true,
                                                          NULL,
                                                          NULL,

&Throwable).GetClass();

I'm guessing that this is what requires a fully-qualified assembly name to
be passed in, correct?

Now for the next part--I create the managed instance successfully, now I
want to do something with it; specifically, I want to get hold of the
System.Type of the managed instance (so I can Reflect against it, and so
on). I'm doing this:

  // Create my managed instance
  //
  if (FAILED(hr =
ClrCreateManagedInstance(L"Personal.Hello,Hello,Version=1.0.0.0,Culture=neut
ral,PublicKeyToken=2087f203b8e16004",
                                           IID_IManagedInstanceWrapper,
(void**)&pWrap)))
  {
    fprintf(stderr, "ClrCreateManagedInstance failed with hr=0x%08x\n", hr);
    return 2;
  }

  // Try to get the type
  //
  VARIANT RetVal;
  VariantClear(&RetVal);
  if (FAILED(hr = pWrap->InvokeByName(L"GetType", CorFFIInvokeMethod, 0,
NULL, &RetVal)))
  {
      fprintf(stderr, "InvokeMethodByName failed with hr=0x%08x\n", hr);
      return 3;
  }
  // This prints out "RetVal VT=9"
  //
  printf("RetVal VT = %d\n", V_VT(&RetVal));

  // Which corresponds to VT_DISPATCH, which makes me believe I can do this:
  //
  IManagedInstanceWrapper* pTypeWrap;
  V_UNKNOWN(&RetVal)->QueryInterface(IID_IManagedInstanceWrapper,
(void**)&pTypeWrap);
  // But I get a fatal explosion when executing this line--specifically,
V_UKNOWN(&RetVal) returns 0x00000000

  printf("pTypeWrap = %dx\n", pTypeWrap);

  VariantClear(&RetVal);
  if (FAILED(hr = pWrap->InvokeByName(L"ToString", CorFFIInvokeMethod, 0,
NULL, &RetVal)))
  {
      fprintf(stderr, "InvokeMethodByName failed with hr=0x%08x\n", hr);
      return 4;
  }

  printf("RetVal VT = %d\n", V_VT(&RetVal));

So what am I getting back from the InvokeMethodByName call when the return
is a managed object type?

Ted Neward
{ .NET && Java } Author, Instructor
http://www.javageeks.com
http://www.clrgeeks.com

----- Original Message -----
From: "Jan Kotas" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Friday, August 02, 2002 5:20 PM
Subject: Re: [DOTNET-ROTOR] Hosting Rotor


> It works on non-Rotor assembly with a fully qualified name too. Here is
> what I did:
>
>
> 1) generate a brand new strongname pair:
>
> C:\sscli\tests\dev>sn -k test.snk
>
>
> 2) create a simple assembly signed with the new key:
>
> C:\sscli\tests\dev>csc /target:library test.cs
>
> test.cs is:
> ---------------------
> using System;
> using System.Reflection;
>
> [assembly: AssemblyKeyFileAttribute("test.snk")]
> [assembly: AssemblyVersionAttribute("1.2.3.4")]
>
> namespace MyNamespace {
>     public class MyClass {
>         public MyClass() {
>         }
>
>         public int MyMethod() {
>             return 1234;
>         }
>     }
> }
> ---------------------
>
>
> 3) add the assembly to the GAC and make sure that it is there:
>
> C:\sscli\tests\dev>gacutil /i test.dll
> C:\sscli\tests\dev>gacutil /l test
>
> The following line was somewhere in the output of the last command:
>
> test, Version=1.2.3.4, Culture=neutral, PublicKeyToken=13fc20dbd9a37515,
> Custom=null
>
>
> 4) modify ffitest
>
> C:\sscli\tests\dev\ffitest>build
>
> The important part of ffitest.cpp is:
> -------------
>     hr = ClrCreateManagedInstance(
>
> L"MyNamespace.MyClass,test,Version=1.2.3.4,Culture=neutral,PublicKeyToke
> n=13fc20dbd9a37515",
>         IID_IManagedInstanceWrapper,
>         (void**)&pWrap);
>     if (FAILED(hr)) {
>         fprintf(stderr, "ClrCreateManagedInstance failed with
> hr=0x%08x\n", hr);
>         return 1;
>     }
>
>     VariantClear(&RetVal);
>     hr = pWrap->InvokeByName(
>         L"MyMethod", CorFFIInvokeMethod, 0, NULL, &RetVal);
>
>     if (FAILED(hr)) {
>         fprintf(stderr, "InvokeMethodByName failed with hr=0x%08x\n",
> hr);
>         return 1;
>     }
>
>     printf("MyMethod() returned %d\n", V_I4(&RetVal));
> -------------
>
> 5) verify that it works:
>
> C:\sscli\tests\dev>ffi_test.exe
> MyMethod() returned 1234
>
> This posting is provided "AS IS" with no warranties, and confers no
> rights.
>
> -----Original Message-----
> From: Ted Neward [mailto:[EMAIL PROTECTED]]
> Sent: Friday, August 02, 2002 4:34 PM
> To: [EMAIL PROTECTED]
> Subject: Re: [DOTNET-ROTOR] Hosting Rotor
>
>
> Jan, I would hate to be the one to disagree with you, but.... In my
> example, Hello *was* installed in the Rotor GAC. That was the first
> thing I thought of. Now, again, it's always possible that it's just me
> being brain-dead, but can you try the test with a non-Rotor assembly?
>
> Ted Neward
> { .NET && Java } Author, Instructor
> http://www.javageeks.com
> http://www.clrgeeks.com
>
> ----- Original Message -----
> From: "Jan Kotas" <[EMAIL PROTECTED]>
> To: <[EMAIL PROTECTED]>
> Sent: Friday, August 02, 2002 2:34 PM
> Subject: Re: [DOTNET-ROTOR] Hosting Rotor
>
>
> > The assert you are seeing is just a sideefect. It is caused by a buggy
>
> > error handling codepath in ClrCreateManagedInstance.
> >
> > The actual problem is that the fusion is not able to locate the
> > assembly in the GAC. Unfortunately one of the limitations of the
> > current implementation of ClrCreateManagedInstance is that it needs a
> > fully qualified name of the assembly in order to find it in the GAC.
> > Here is an example of a fully qualified name of an assembly that
> > worked for me:
> >
> >     hr = ClrCreateManagedInstance(
> >
> > L"System.Xml.Xsl.XslTransform,System.Xml,Version=1.0.3300.0,Culture=ne
> > ut
> > ral,PublicKeyToken=b77a5c561934e089",
> >         IID_IManagedInstanceWrapper,
> >         (void**)&pWrap);
> >
> > We will try to do better for the next Rotor release...
> >
> > -Jan
> >
> > This posting is provided "AS IS" with no warranties, and confers no
> > rights.
> >
> > -----Original Message-----
> > From: Ted Neward [mailto:[EMAIL PROTECTED]]
> > Sent: Thursday, August 01, 2002 4:01 PM
> > To: [EMAIL PROTECTED]
> > Subject: [DOTNET-ROTOR] Hosting Rotor
> >
> >
> > I'm trying to extend and experiment with the ffi_test example, which
> > demonstrates how to create a managed instance within Rotor from
> > unmanaged code; I've reproduced the .cpp code here[1] for reference.
> >
> > So I take the first section of code, to do the
> > ClrCreateManagedInstance(), and I change it to do one of my own types:
> >
> >   hr = ClrCreateManagedInstance(
> >       L"Personal.Hello,Hello,PublicKeyToken=2087f203b8e16004",
> >       //L"System.Object,mscorlib,PublicKeyToken=b03f5f7f11d50a3a",
> >       //L"System.Random,mscorlib,PublicKeyToken=b03f5f7f11d50a3a",
> >       IID_IManagedInstanceWrapper,
> >       (void**)&pWrap);
> >   if (FAILED(hr)) {
> >       fprintf(stderr, "ClrCreateManagedInstance failed with
> > hr=0x%08x\n", hr);
> >       return 2;
> >   }
> >
> > When I execute this code using the Personal.Hello type as the target
> > (where Personal.Hello is a strongly-named assembly installed in the
> > GAC), I trip an assertion failure:
> >
> > C:\Prg\Rotor\sscli\tests\dev\host_test>rotor_x86\host.exe
> > Assert failure(PID 2296 [0x000008f8], Thread: 2308 [0x904]):
> > !m_fPreemptiveGCDisabled
> >     File: r:\rotor\19jun2002\sscli\clr\src\vm\threads.h, Line: 899
> > Image: C:\Prg\Rotor\sscli\tests\dev\host_test\rotor_x86\host.exe
> >
> > Whereas running with the Microsoft types (System.Object or
> > System.Random) offers up no such assertion. Anybody got any ideas
> > what's going on here, or what I'm doing wrong? (I'm hoping this is a
> > quick-answer--I've not dug into the ClrCreateInstance impl to try and
> > debug it.)
> >
> > Ted Neward
> > {.NET || Java} Course Author & Instructor, DevelopMentor
> > (http://www.develop.com)
> > http://www.javageeks.com/tneward http://www.clrgeeks.com/tneward
> >
> > [1] from sscli/tests/dev/ffi_test/ffitest.cpp
> >
> > #include "windows.h"
> > #include "stdlib.h"
> >
> > #include "cor.h"
> > #include "mscoree.h"
> > #include "corffi.h"
> >
> > int __cdecl main(int argc, char ** argv, char ** envp)
> > {
> >     IManagedInstanceWrapper *pWrap;
> >     VARIANT RetVal;
> >     HRESULT hr;
> >
> >     if (!PAL_RegisterLibrary(L"rotor_palrt") ||
> >         !PAL_RegisterLibrary(L"sscoree")) {
> >         fprintf(stderr, "PAL_RegisterLibraryW failed\n");
> >         return 1;
> >     }
> >
> >     hr = ClrCreateManagedInstance(
> >         L"System.Random,mscorlib,PublicKeyToken=b03f5f7f11d50a3a",
> >         IID_IManagedInstanceWrapper,
> >         (void**)&pWrap);
> >     if (FAILED(hr)) {
> >         fprintf(stderr, "ClrCreateManagedInstance failed with
> > hr=0x%08x\n", hr);
> >         return 2;
> >     }
> >
> >     VariantClear(&RetVal);
> >     hr = pWrap->InvokeByName(
> >         L"Next", CorFFIInvokeMethod, 0, NULL, &RetVal);
> >
> >     if (FAILED(hr)) {
> >         fprintf(stderr, "InvokeMethodByName failed with hr=0x%08x\n",
> > hr);
> >         return 3;
> >     }
> >
> >     if (V_VT(&RetVal) != VT_I4) {
> >         fprintf(stderr, "Invalid return type (%d)\n", V_VT(&RetVal));
> >         return 3;
> >     }
> >
> >     printf("System.Random.Next() returned %d\n", V_I4(&RetVal));
> >
> >     pWrap->Release();
> >
> >     return 0;
> > }
> >
>

Reply via email to