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;
> }
>