Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use the correct unmanaged DLL file according CPU architecture? (32 / 64 bits)

I have to use a C++ DLL file from an ASP.NET site. The site will be hosted on both 32 and 64 bits environments.

I have a 32 and 64 bits version of the unmanaged DLL file. How do I import the methods from the correct one according the current server architecture?

Like someone posted, this could be handled as a deployment problem. My concern is: the web application consuming this DLL file is huge, and we don't have a deployment document. No one will remember to deploy the correct DLL file, so I'm trying to remove the human factor from the solution :)

like image 900
StackOverflower Avatar asked Sep 03 '10 19:09

StackOverflower


2 Answers

Simplest approach would be to give the two native libraries the same filename in two different directories, then adjust your application DLL search path depending on the bitness.

http://www.pinvoke.net/default.aspx/kernel32.setdlldirectory

like image 79
Ben Voigt Avatar answered Oct 07 '22 17:10

Ben Voigt


To get the compiler/framework to do most of the work you need to

  1. have multiple build 'platforms' (typically x86, x64 - remove AnyCPU)
  2. set each "platform target" configuration for each build config
  3. we added conditional compilation symbols __WIN32 & __X64

List the different implementations for your functions according to platform, including different dll names if you need to have both installed at once.

#if __WIN32
        public delegate int Move(int target);
        [DllImport("my.dll", SetLastError = true, CharSet = CharSet.Auto)]
#elif __X64
        public delegate int Move(int target);
        [DllImport("my64.dll", SetLastError = true, CharSet = CharSet.Auto)]
#endif

Otherwise you can use loadlib and manage the marshalling yourself.

like image 31
Greg Domjan Avatar answered Oct 07 '22 17:10

Greg Domjan