Альтернативой InterOp является написание C ++ DLL с использованием расширений CLR, которая действует как оболочка для традиционной C ++ DLL. Это дает вам возможность обрабатывать необычные типы, например, пользовательские структуры или классы, если Marshaling не будет работать. (Согласно MSDN вы можете расширить поддержку Marshaling (http://msdn.microsoft.com/en-us/library/bb531313.aspx), но я не пробовал это лично, и в зависимости от того, что вы делаете, это может быть много работы).
Например, если вы хотите получить доступ к DLL, которая экспортирует класс, вы можете иметь DLL-оболочку, которая владеет экземпляром класса C ++ и определяет класс .NET, который отображается на класс C ++. Например, вот фрагмент из C ++ / CLR DLL, который мы используем, чтобы сделать одну из наших старых C ++ DLL доступными в .NET:
// This is the constructor for the CLR (managed) object
FileInf::FileInf()
{
// Create the C++ (unmanaged) object
m_pFileInf = gcnew DILib::FileInf();
}
// This is a managed interface which replicates the old
// unmanaged functionality
bool FileInf::IsDirectory()
{
return m_pFileInf->IsDirectory();
}
Я бы сказал, что если InterOp работает, то придерживайтесь его, но я не уверен, что это лучший способ решить каждую проблему взаимодействия C ++ / .NET, и это альтернатива.