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=neut
> 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