views:

3993

answers:

3

We have a (pure native C++) .DLL that is build by VS. As clients we have some native C++ applications and a .Net-Wrapper around this DLL written in C++/CLI. Finally there are some client applications for the .Net-Wrapper written in C#.

My problem is that the native.dll must be distributed in a different way than the .Net world works and the VS does not keeps track of that DLL. So to let all my C# Apps work correctly I have to copy it to each executable directory or put it somwhere in %PATH% (which I would avoid on developer computers since they may want to start different apps with different versions of the DLL). Even bigger problems occur if there are UserControls that reference the Wrapper-DLL: You have to copy the DLL to VS's directory or again to %PATH%. But the worst case occurs with our Translator tool. This tool keeps track of .Net-Assemblies and packs them into Translator-packages that can be send to an external translator. As far as I know there is no way to put the native .DLL into that package!

So I plan to link the native DLL statically into the .Net-Wrapper which would solve my problems. But for our Native applications this native DLL must still be a DLL.

So I have two options:

  • Make two projects of that (one that generates a static library; and one that creates a dynamic one => I try to avoid this)
  • Find a solution to link DLLs statically
  • Find a way to let VS generate two outputs from one project
+2  A: 

Pick up a copy of DLL to Lib (Edit: If you can't find a cheaper option)

Shane MacLaughlin
A bit expensive, isn't it?
rstevens
It's especially expensive given that you already have the source for the DLL. You can simple recompile it as a static lib file. But .Net won't use it since .Net doesn't do lib files. That also means DLL To Lib won't help you.
Rob Kennedy
Whoaa, that has gone up by about a factor of 10 since I bought it a couple of years back. Ouch!
Shane MacLaughlin
Yup just checked, I'm running 1.42, which cost $99 in 2003 which was an ok price at the time.
Shane MacLaughlin
@Rob: .Net shouldn't create a LIB. I like to link a LIB statically into a C++/CLI project emitting a (mixed) .NET assmebly. That works and so DLL To Lib would help...if it wasn't that expensive! (@smacl: $99 would be OK, but $999...)
rstevens
If you have the source for the dll just build a lib and use that to link statically?Or do you not have the source for the dll?
PintSizedCat
Try emailing them, they will probably sell it to you for much less. Or you can ask to buy their old version for 99.
Brian R. Bondy
@PintSizedCat: I have the source but I have to build a DLL for our native Apps and a LIB for the .NET-Wrapper.
rstevens
IF DLL To Lib would work, then you don't need it. VS is perfectly capable of creating a lib file from your code already. If you can link a .lib file to your .Net project, then do that. My impression, though, was that .Net assemblies cannot be linked to native .lib files.
Rob Kennedy
+2  A: 

Another option is to have two projects, one project will output a .lib which can be statically linked, and a second project which will output a .dll and will have your .lib as dependency, you should add .def to your .dll with the symbols that you are planning to export, or else it will be empty.

Ismael
Sounds good. I will give it a try. At the moment I solved the problem by adding the obj-Files as additional input to the linker in the Wrapper-DLL (../NativeLib/$(PlatformName)/$(ConfigurationName)/*.obj). But this is kind of crude and your options sounds better!
rstevens
A: 

In the C++ project file for the dll, create two configurations, one that generates a DLL and one that generates a .lib. Two projects are not necessary, since any .NET/C++ project can support multiple build configurations (this is how Release and Debug versions build differently).

BmanInHouston
But there is no way to build two configurations of the same project in one go, is there? Normally you can select one project configuration/platform in the configuration manager for a solution configuration/platform.
rstevens