Метод отладки класса Com

Я разрабатываю классы COM Interoperable с использованием Visual Studio 2008. И использую эти классы в Visual FoxPro 9.0. Когда я скомпилировал библиотеку классов, она регистрируется после компиляции.

В Visual FoxPro я создаю объект с помощью этого фрагмента кода в командном окне:

newObj = CREATEOBJECT("CemT.Deneme.ClassTest")

Когда я хотел изменить библиотеку классов в Visual Studio, я не могу снова скомпилировать и зарегистрировать dll. Это дает мне эту ошибку:

Unable to copy file "obj\Debug\clCOMTest.dll" to "bin\Debug\clCOMTest.dll". The process cannot access the file 'bin\Debug\clCOMTest.dll' because it is being used by another process.

С этой ошибкой мне пришлось бы выйти из VFP и начать заново. Перед созданием объекта я компилирую библиотеку классов в Visual Studio. Тогда я могу использовать последнюю версию dll.

Это выглядит очень нормально, потому что VFP использует dll, но есть ли способ сделать это без перезапуска VFP?


person uzay95    schedule 04.01.2012    source источник
comment
DLL имеет жесткую блокировку, потому что она была загружена в процесс FoxPro. Вам придется убедить FoxPro снова выгрузить эту DLL. Глядя на документы, вам как минимум понадобится RELEASE. Как вы заставляете его вызывать CoFreeUnusedLibraries(), можно только догадываться. Вместо этого протестируйте свой код с помощью модульного теста.   -  person Hans Passant    schedule 04.01.2012
comment
Модульный тест был бы хорош, но VFP будет вызывать классы .NET. Вот почему вызовы функций имеют разные типы параметров. Иногда передача параметров другого типа может быть затруднена или невозможна. RELEASE ALL делает каждую переменную нулевой, определенной в командном окне. Но все же я не могу скомпилировать, выдает ту же ошибку.   -  person uzay95    schedule 04.01.2012
comment
@HansPassant: модульные тесты предназначены для языков без приличного графического отладчика с возможностью редактирования и продолжения! (Шутка: модульные тесты по-прежнему хороши, но они дополняют возможность правильной отладки).   -  person Ben    schedule 04.01.2012


Ответы (4)


В VFP вы пробовали

RELEASE LIBRARY {ваш dll-файл}

или, согласно документации, вы можете очистить ВСЕ библиотеки API,

УСТАНОВИТЬ БИБЛИОТЕКУ НА

(без какого-либо конкретного имени библиотеки), чтобы очистить их

person DRapp    schedule 04.01.2012

Раньше, когда я делал такие вещи (компоненты С++ COM, предназначенные для использования с VB в качестве хоста), я устанавливал командную строку «Отладка», чтобы открыть правильный проект в VB.

Другими словами, я запускал среду разработки VB в отладчике C++.

Это было хорошо, потому что я все еще могу устанавливать точки останова в своей DLL и т. д. и одновременно работать как на стороне VB, так и на стороне C++. (Только не забудьте нажать «Сохранить» в VB, прежде чем нажать «Стоп» в C++!)

Я никогда не использовал FoxPro, но вы, вероятно, можете сделать то же самое с опцией -C:

http://msdn.microsoft.com/en-us/library/bzb50fbk(v=VS.71).aspx

person Ben    schedule 04.01.2012

Это довольно просто, если я правильно понимаю вопрос, в VFP,

Выпустить новыйОбъект

person Swordblaster    schedule 08.01.2012

VFP не полностью освобождает COM-объекты из памяти, пока приложение не будет закрыто.

Использование команды RELEASE не освобождает его полностью.

person Community    schedule 14.01.2015