.net - Non-managed referenced code strangely, "magically" changes its state for no reason when wrapped in managed -
i have strange problem:
my unmanaged third-party library has class, let's call foo
has method bar()
returns object of type bar
, like:
foo* foo = new foo(); bar bar = foo -> bar();
now, bar
has method supposed return true
when obtained via above means. in unmanaged code, works desired:
foo* foo = new foo(); bar bar = foo -> bar(); // yes, bar() returns object, not pointer bool b = bar.shouldbetrue(); // b true
now, wrote managed wrapper foo
, bar
simple:
managed.h:
namespace managed { public ref class managedbar { private: thirdparty::bar* _delegate; public: managedbar(thirdparty::bar* delegate); ~managedbar(); bool shouldbetrue(); }; public ref class managedfoo { private: thirdparty::foo* _delegate; public: managedfoo(); ~managedfoo(); managedbar^ bar(); }; }
managedbar.cpp (includes stripped):
namespace managed { managedbar::managedbar(thirdparty::bar* delegate) { _delegate = delegate; } managedbar::~managedbar() { delete _delegate; } bool managedbar::shouldbetrue() { return _delegate -> shouldbetrue(); } }
managedfoo.cpp:
namespace managed { managedfoo::managedfoo() { _delegate = new thirdparty::foo(); } managedfoo::~managedfoo() { delete _delegate; } managedbar^ managedfoo:bar() { thirdparty::bar tpb = delegate -> bar(); //for test/debugging: bool b = tpb.shouldbetrue(); // b true return gcnew managedbar(&tpb); } }
now, when call following in vb.net (in unit test):
imports managed <testclass()> public class mytest <testmethod()> public sub testbarreturnstrue() dim f managedfoo = new managedfoo() dim b managedbar = f.bar() assert.istrue(b.shouldbetrue()) end sub end class
but assert fails because false. when step managedbar
, _delegate -> shouldbetrue()
called without errors. behaviour strange. did wrong wrapping, or have ask supplier of third-party dll advice?
the problem in:
managedbar^ managedfoo:bar() { thirdparty::bar tpb = delegate -> bar(); //for test/debugging: bool b = tpb.shouldbetrue(); // b true return gcnew managedbar(&tpb); }
tpb destroyed after function call. should allocate tpb on heap(you need manually free it), save somewhere(as member) or pass value managedbar.
hope you.
Comments
Post a Comment