У меня есть C++ DLL с помощью следующего метода:Проходя управляемый элемент класса в C метод ++
//C++ dll method (external)
GetServerInterface(ServerInterface* ppIF /*[OUT]*/)
{
//The method will set ppIF
}
//ServerInterface is defined as:
typedef void * ServerInterface;
Чтобы получить доступ к DLL из C# проекта, я создал проект C++/CLI и объявил управляемый класс следующим образом:
public ref class ComWrapperManager
{
//
//
ServerInterface _serverInterface;
void Connect();
//
//
}
Я использую метод Connect() для вызова GetServerInterface, как показано ниже. Первый звонок работает, второй - нет. Может кто-нибудь объяснить, почему? Мне нужно сохранить этот указатель как переменную-член в управляемом классе. Любой лучший способ сделать это?
void Connect()
{
ServerInterface localServerInterface;
GetServerInterface(&localServerInterface); //THIS WORKS
GetServerInterface(&_serverInterface); //THIS DOESNT
//Error 1 error C2664: 'ServerInterface ' :
//cannot convert parameter 1 from //'cli::interior_ptr<Type>'
//to 'ServerInterface *'
}
Спасибо, Ханс. Отличный ответ, как всегда. Итак, присвоение переменной стека (temp) члену класса будет оставаться фиксированным? – bobbyalex
Erm, нет, дело в том, что указатель на * temp * не является внутренним указателем, поэтому его можно без проблем передать на собственный код. Назначение члену класса не вызывает проблем, поскольку оно выполняется в управляемом коде. Большое дело в том, что джиттер генерирует этот код, он создает дополнительную информацию для GC, которая позволяет обнаруживать управляемые указатели. Подобно * this * reference, хранящемуся в регистре CPU. Эта информация отсутствует для собственного кода. –
Я вижу. Итак, по вашему мнению, какой лучший способ сохранить указатель, который я получаю из метода GetServerInterface? Мне нужно это позже для других звонков. – bobbyalex