Мы постоянно занимаемся этим с нашими проектами.
У нас есть неуправляемая DLL-библиотека C ++, имеющая 32- и 64-разрядные версии, и проект C #, использующий P / Invoke для вызова неуправляемой DLL.
Для C ++ DLL это целевой путь:
$ (PlatformName) \ $ (ConfigurationName) \ $ Имя_целевого_объекта)
Таким образом, сборка 32-разрядной версии будет идти в Win32 \ Release, а сборка 64-разрядной отладки - в x64 \ Debug.
В проекте C # мы удаляем конфигурацию «Любой ЦП» и заменяем ее новой конфигурацией «x86» и конфигурацией «x64». Его выходные каталоги аналогичны неуправляемым DLL-библиотекам C ++, за исключением того, что компилятор .NET использует «x86», тогда как C ++ использует «Win32» для обозначения исполняемого файла 32-разрядной архитектуры.
На этапе после сборки для проекта C # мы копируем соответствующую неуправляемую DLL в целевой каталог для исполняемого файла C #. Поскольку каждая архитектура и каждая конфигурация проекта C # имеют отдельный выходной каталог, нет проблем с определением, какая архитектура неуправляемой DLL находится в каком выходном каталоге; они всегда совпадают.
Чтобы еще больше упростить это, я предлагаю вам исследовать создание многофайловой сборки (http://msdn.microsoft.com/en-us/library/226t7yxe.aspx), чтобы ваша неуправляемая DLL и ее оболочка C # могли одновременно находиться в одной сборке .NET, что избавляет вас от необходимости копировать ее вокруг. на все.