I'm using Visual Studio 2008 to build a Solution with two Projects: a C# Console App and a C++ DLL. I want the app to call a function from the dll using P/Invoke. Therefore I'm trying to add the dll as a Reference to the C# app. But when I try the Add Reference command, Visual Studio won't let me do it unless I set the /clr property on the dll (under Configuration Properties:General). Now, I thought that P/Invoke could handle plain-old win32 dlls. Indeed, if I build my dll without /clr and just copy it by hand to bin/Debug, then the app runs fine. So why is /clr required to add the dll as a reference? And if VS won't let me add it, is there some (clean) workaround so that my app finds the dll?
I see that someone had a similar issue here (though with a 3rd-party dll): Unable to add a DLL Reference to VS 2008 The answer he got was to build a wrapper. But this isn't really necessary, since the app can use the dll just fine; it's just the Add Reference step that doesn't work. And besides, won't the wrapper code need a reference to the dll, raising the same problem as before? I'd really like an answer that doesn't involve writing a wrapper at all.
When using PInvoke on a C++ DLL, it is not necessary to add a reference. References are only needed when you are calling managed code in another DLL. Simply put the C++ DLL in the same directory and add it's name to the
DllImport
attributeWhy not just add a post-build step to copy your unmanaged DLL to your project directory? You don't need a "reference" to be able to refer to an unmanaged DLL, and it sounds like the only problem you're experiencing is due to the file not being automatically copied into the search path.
Theoretically you could add the C++-DLL as a linked resource to your C#-DLL. This would make .NET copy your C++-DLL wherever it copies the C#-DLL even into the GAC. Theoretically means that there are some disadvantages:
So if none of the above is a no-go for you you can call csc.exe the following:
Hope this may help!
Solved a similar issue by doing the following:
On all development machines, added the path to dll-s in question to PATH enviromental variable. That way all the developers could debug all the executables that have a reference to the assembly with unmanaged dll-s, without the need to write a post build script for every executable.
For production, nightly msbuild task builds everything to a single folder, and the unmanaged dll-s that are marked as "Content/Always copy" are automatically included with the build of that one assembly that they are a part of.