Below is my c++ DLL
// DLL.cpp : Defines the exported functions for the DLL application.
#include "stdafx.h"
//#include <stdexcept>
#include<iostream>
using namespace std;
typedef void (*FunctionPtr)(int);
void (*FunctionPtr1)(int);
extern "C" __declspec(dllexport)void Caller();
extern "C" __declspec(dllexport)void RegisterFunction(FunctionPtr func_ptr);
extern void Caller()
{
int i = 10;
FunctionPtr1(i);
}
extern void RegisterFunction(FunctionPtr func_ptr1)
{
FunctionPtr1 = func_ptr1;
}
This DLL will get refernce to function name from c# and pass arguments to c# function.. here is my c# code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace test
{
class Program
{
[DllImport("C:/Users/10602857/Documents/Visual Studio 2010/Projects/DLL/Debug/DLL.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void Caller();
[DllImport("C:/Users/10602857/Documents/Visual Studio 2010/Projects/DLL/Debug/DLL.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern fPointer RegisterFunction(fPointer aa);
static void Main(string[] args)
{
Console.WriteLine("DLL Linking");
fPointer abc = new fPointer(ping);
RegisterFunction(abc); //send address of function to DLL
Caller(); //call from DLL
}
public delegate void fPointer(int s); // point to every functions that it has void as return value and with no input parameter
public static void ping(int a)
{
Console.WriteLine("ping executed " + a);
}
public static void add1()
{
Console.WriteLine("add executed");
}
}
}
c# code is able to get the value which i paseed in c++ dll as below
int i = 10;
FunctionPtr1(i);
M getting the sedired output but progrram got crashed at the end with following execption
Unhandled Exception: System.AccessViolationException: Attempted to read or write
protected memory. This is often an indication that other memory is corrupt.
at test.Program.Caller()
why i am getting this ??
All i need to do is.. just declare my delegate as ...
It could well be that your delegate
is getting garbage collected before it's being used. You need to store the reference to the delegate as a field of the class to ensure it survives for the lifetime of the class.
Try defining
fPointer abc
outsidemain
then assignnew fPointer(ping)
to it insidemain
and see if that helps.Okay, I wrote test code for you. Concept is simple.
You wrote dll using C++ or C.
CLR library(Managed dll) wraps your dll.
Your C# code can use your Native DLL via CLR library.
Your Native DLL
MyDll.cpp
Your CLR library, wrapper for Native Dll
MyDllCLR.h
MyDllCLR.cpp
Your C# code using Native DLL
Program.cs
You need Native DLL and CLR DLL both for Program.cs
And, of course, this is not the only way for your goal. :)