2011-09-24 59 views
5

我有一個DLL函數:調用一個UnmanagedFunctionPointer在C#中的自定義調用約定

char __usercall MyUserCallFunction<al>(int arg1<esi>) 

因爲我恨我自己,我想從C#中使用P/Invoke來調用它。

通常,這可以通過獲取函數委託,一拉來完成:

[UnmanagedFunctionPointer(CallingConvention.ThisCall, CharSet = CharSet.Auto, SetLastError = true)] 
    public delegate char DMyUserCallFunction(IntPtr a1); 

然後做調用它:

var MyFunctionPointer = (DMyUserCallFunction)Marshal.GetDelegateForFunctionPointer(AddressOfFunction, typeof(DMyUserCallFunction)); 

MyFunctionPointer(IntPtr.Zero); 

對於自定義用戶調用約定,但是,這將導致該程序崩潰。是否有某種方式可以使用不安全的代碼或某種封裝函數將代理置於適當位置,但不會強制我編寫C++ DLL?

謝謝!

編輯:

如所建議的通過DTB,我創建了一個非常小的C++ DLL我通過P /調用用來調用該函數。對於任何人來說,C++中的函數最終看起來是這樣的:

extern "C" __declspec(dllexport) int __stdcall callUsercallFunction(int functionPointer, int arg1) 
{ 
    int retVal; 

    _asm 
    { 
     mov esi, arg1 
     call functionPointer 
     mov retVal, eax 
    } 

    //Fake returning al, the lower byte of eax 
    return retVal & 0x000000FF; 
} 
+5

+1「因爲我討厭自己」 – dtb

+0

爲什麼你需要代表呢?你不能'[DllImport(...)]公共外部字節MyUserCallFunction(IntPtr a1)'? – dtb

+0

該函數並未實際導出。我需要通過注入加載DLL的進程來調用該函數。我爲此使用EasyHook--目標是鉤住任何我可以在DLL中使用IDA找到的任意函數。 – mweber

回答

2

在C#中實現自定義調用約定是沒有希望的。您必須在本機DLL或C++/CLI DLL中執行此操作。