Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8042079
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 5, 20262026-06-05T04:27:05+00:00 2026-06-05T04:27:05+00:00

I have recently been tinkering around with C# to C++ interop, in particularly setting

  • 0

I have recently been tinkering around with C# to C++ interop, in particularly setting up a callback function which is called from the C++ DLL.

namespace TomCSharpDLLImport
{
    class Program
    {
        public delegate void TomDelegate(int a, int b);

        [DllImport("TomDllNative.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void GetData();

        [DllImport("TomDllNative.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void SetCallback(TomDelegate aCallback);

        static void Main(string[] args)
        {
            TomDelegate lTD = new TomDelegate(Program.TomCallback);

            SetCallback(lTD); //Sets up the callback

            int thread = Thread.CurrentThread.ManagedThreadId;

            GetData(); //This calls the callback in unmanaged code

            while (true) ;
        }

        //Callback function which is called from the unmanaged code
        public static void TomCallback(int a, int b)
        {
            Console.WriteLine("A: {0} B: {1}", a, b);
            int thread = Thread.CurrentThread.ManagedThreadId;
        }
    }
}

The question I have is that, when the program control comes into the TomCallback function, I was expecting it to then hit the while(true) loop in Main. However instead the program just exits. I can’t quite get my head round the behaviour, part of me imagines this is as expected but part of me would have expected it to continue on in main.

What I was expecting…

  1. The GetData() function is called
  2. The GetData function calls the callback
  3. The callback function returns back to GetData
  4. GetData returns back to main()

However this is not quite right.

Would someone be kind enough to explain what happens.

In order to save space I haven’t posted the unmanaged code, however if it is needed i’m happy to post

Edit:
I turned on Unmanaged debugging (totally forgot to do this) and now I see the crash..

Run-Time Check Failure #0 – The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

Native code as this is where crash is

#include "stdafx.h"
typedef void (*callback_function)(int, int);

extern "C" __declspec(dllexport) void SetCallback(callback_function aCallback);
extern "C" __declspec(dllexport) void GetData();

callback_function gCBF;

__declspec(dllexport) void SetCallback(callback_function aCallback)
{
    gCBF = aCallback;
}

__declspec(dllexport) void GetData()
{
    gCBF(1, 2);
}
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-05T04:27:07+00:00Added an answer on June 5, 2026 at 4:27 am

    You must convert your managed callback to the Native Function Pointer (IntPtr in C#) by using the

    IntPtr Marshal.GetFunctionPointerForDelegate(Delegate d)
    

    method.

    Your usage of SetCallback() with System.Delegate as an argument is wrong.

    Make it

    SetCallback(Marshal.GetFunctionPointerForDelegate(lTD));
    

    and redeclare SetCallback as

    /// StdCall is crucial here
    [DllImport("TomDllNative.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern void SetCallback(IntPtr aCallback);
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have recently been asked to estimate a piece of work which will provide
I have recently been introduced to the new Access 2007 feature which is multivalued
I have recently been tasked with upgrading an application from .net 1.1 to 3.5
I have recently been working with Matlab. My question stems from my usage over
Have recently been given a project to complete which uses XML quite extensively.Am looking
I have recently been developing a website which relies a large part on the
I have recently been playing around with Codeigniter to see what I can learn
I have recently been thrown into learning ClearCase (I come from a background with
I have recently been working on a nodejs app which uses open socket connections
I have recently been put in charge of debugging two different programs which will

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.