2

I have have a function in wrote in C++ that calls some functions in a old lib. This function creates some memory makes the calls and destroys the memory. To optimize this I would create an object that would keep the memory allocated until the object was destroyed. However I'm going to be calling this function from C# and don't believe I can export a Class, just functions or variables.

My idea is instead this; Think of the DLL as a class and the use local vars inside the scope of the dll to point to memory. Then have a function to create the memory, call the worker functions and another to destroy the memory when done with the DLL.

Is this a good approach? Is there a better way?

Cœur
  • 37,241
  • 25
  • 195
  • 267
QueueHammer
  • 10,515
  • 12
  • 67
  • 91

3 Answers3

2

I prefer to write a managed wrapper in C++/CLI (formerly Managed C++), as it makes it much easier to explicitly do what you want with managed/unmanaged interoperability on the C++ side, and your C# doesn't get polluted with P/Invoke style code.

Edit Just noticed your comment "However I'm going to be calling this function from C# and don't believe I can export a Class, just functions or variables."

That's not entirely true - C# can import full classes from an assembly generated from C++/CLI code.

Not Sure
  • 5,873
  • 3
  • 23
  • 29
1

Make a C# class that implements IDisposable. You can wrap a simple C API around your C++ object, so when you construct an instance, it returns a pointer to the C++ class, and when you Dispose() of your C# class, it deletes the pointer.

You can always dereference this pointer to call methods on your C++ class.

Another good alternative is to just use C++/CLI to make a wrapper for your C++ class. Handling this type of situation is much simpler there.

Reed Copsey
  • 554,122
  • 78
  • 1,158
  • 1,373
  • Could you provide links to some examles; e.g. Using pointers to C classes with IDisposable, using C++/CLI to make a wrapper. – QueueHammer Apr 17 '09 at 20:04
  • I've got a sample on my blog (http://reedcopsey.com/?p=7) for the first. Any C++/CLI sample would work for the second - you'd just make it a managed class in C++/CLI instead of a native C++ class. – Reed Copsey Apr 17 '09 at 20:37
1

If you are willing to change the native C++ code, you could always export it as a COM interface which C# can consume.

Jeff Mc
  • 3,723
  • 1
  • 22
  • 27