Few things to note for comfort transition from C# to C++/CLI
Pragmas
// use on base level, outside of namespace
#pragma unmanaged
#pragma managed
//Regions
#pragma region Helpers
#pragma endregion
Needed rotate, not just shift
//native
#define asm_ror(val, shift) __asm { ror val,shift }
#define asm_rol(val, shift) __asm { rol val,shift }
//managed
#define managed_ror(val, shift) val=((val>>shift)|(val<<(32-shift)))
#define managed_rol(val, shift) val=((val<<shift)|(val>>(32-shift)))
Nested namespaces
namespace Zamboch
{
 namespace Engine
 {
...
 }
}
Calling to native code and back to CLR
#pragma once
#include <vcclr.h>
using namespace System;
using namespace System::Runtime::InteropServices;
#pragma unmanaged
extern "C" { 
    typedef void* (__stdcall *myCALLBACK)(int smallIndex);
}
// static pointer to managed function
myCALLBACK fnGetDataPage;
void foo()
{
    //Calling back to CLR
    void* dtpage=fnGetDataPage(1);
}
#pragma managed
ref class Class1
{
public:
    // testing entrypoint
    static void Main()
    {
        //Call to native
        foo();
    }
    //callback implementation
    static void* GetDataPage(int smallIndex)
    {
        void* dtpage = NULL;
        return dtpage;
    }
private:
#pragma region Delegate initialization
    delegate void* myCALLBACKDelegate(int smallIndex);
    static GCHandle gch;
    //static constructor, initialize delegate here
    static Class1()
    {
        myCALLBACKDelegate^ fp=gcnew myCALLBACKDelegate(GetDataPage);
        gch = GCHandle::Alloc(fp);
        fnGetDataPage = static_cast<myCALLBACK>(Marshal::GetFunctionPointerForDelegate(fp).ToPointer());
    }
#pragma endregion
};
No comments:
Post a Comment