December 08, 2012
Consider the following code:

module sharedInterface;

class A {}

module mainExecutable;
import sharedInterface;
import core.stdc.stdio;

extern(C)
{
  alias Object function() MakeObjectFunc;
}

__gshared MakeObjectFunc MakeObject;

void main(string[] args)
{
  //Load the dll with LoadLibrary and
  //get the address of MakeObject with GetProcAdress

  auto obj = cast(A)MakeObject();
  printf("obj = %x\n", cast(void*)obj);
}

module dll;

extern(C) export Object MakeObject()
{
  return new A();
}


The modules sharedInterface and mainExecutable are compiled into a executable. The modules dll and sharedInterface are compiled into a dll.

The exexutable will print
obj = 0x0

Because the _d_isbaseof2 in cast_.d does not work across dll boundaries.
It always uses the "is" operator for comparing two TypeInfo_Class objects, which breaks the dll support. Now this can be fixed, but it would require a full compare each time which would make casting significantly slower.

Should this be fixed or do we want to wait for a shared dll version of druntime?


I also found that inside Thread.remove

if( sm_tbeg == t )
  sm_tbeg = t.next;

Will crash across dll boundaries inside object_.d opEquals(Object, Object) because the vtable of one of the objects is invalid. Using the is operator instead of the compare fixed it for me.

Kind Regards
Benjamin Thaut