tags:

views:

295

answers:

2

I have a .NET application that uses some API calls, for example GetPrivateProfileString. So far it has always run on 32-bit machines.

In order to run on 64-bit machines, must I change the "Platform Target" to "x86"? Or is there a way to let the runtime know which API DLL to invoke depending on the runtime environment?

+1  A: 

You need to make sure that you're only using P/Invoke calls against a 64bit DLL.

One option is to move all of your "methods" into a standard interface (or abstract base class), and provide 2 implementations, one 32bit and one 64bit. You can have a factory method construct the appropriate instance of the class depending on the size of IntPtr.

This allows an "AnyCPU" app to correctly, at runtime, determine which DLL to P/Invoke into, and does work.

Reed Copsey
That's great - thanks! Looks like this question might be closed as a duplicate of 2378484, your answer would probably be welcome over there too.
Eric
@Eric: Thanks for the heads up - I put it over there, too - although it's still a potential answer here :)
Reed Copsey
+1  A: 

You'll have no trouble if the DLL whose export you P/Invoke is also available in a 64-bit version. Which is definitely the case for the Windows DLLs, like kernel32.dll. GetPrivateProfileString() will work just as well, you don't need to make the [DllImport] attribute any different. Assuming you used IntPtr where required.

Odds get lower when you use COM servers that are outdated or were not written by Microsoft or 3rd party DLLs. You'll find out quickly if the x86 Target Platform override is required. 32-bit DLLs produce a BadImageFormat exception, 32-bit COM servers produce a Class Not Registered exception.

Hans Passant