2016-08-05 7 views
-2

Я пытаюсь импортировать в проект C++ Project Dll в проект C#. Я обнаружил, что многие люди говорят об использовании DllImport. Я пытался использовать это, и вот что я have-Невозможно импортировать dll C++ в проект C# с использованием DllImport

CPP Код:

int __declspec(dllexport) beginCode(double reportId); 

C# Код:

[DllImport("C:\\Users\\<my_user_id>\\Desktop\\ctxmix\\Release\\ctxmix.dll",CallingConvention =CallingConvention.Cdecl ,CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
public static extern int beginCode(double reportId); 
int result = beginCode(reportId); 

Но когда я бегу, я получаю исключение - Исключение выбрано: «System.DllNotFoundException»

Должен ли я добавить ссылки на CPP Dll в проект или сделать что-нибудь еще, кроме кода, который у меня есть на вершине?

Редактировать: Я пытаюсь запустить мой .exe, используя VS2015, и получаю это исключение на своей локальной машине. Кроме того, я не вижу свою CPP Dll в разделе Project-> References, где я вижу другие ссылки там.

+0

Нет, это не дубликат, потому что они могут успешно работать на машине, но не могут загрузить их на другой компьютер под управлением Windows 2003. В моем случае я получаю это исключение на своем компьютере, когда запускаю его с помощью VS2015. – Teja

+0

Я бы использовал команду 'dumpbin/exports [your dll here]' (включенную в командную строку visual studio), чтобы увидеть, что на самом деле является именем экспортируемой функции. Скорее всего, компилятор C++ переводит beginCode в другое, поэтому он не может найти функцию. Вы можете исправить это, изменив значение «ExactSpelling» на false. Кроме того, я не думаю, что CallingConvention.Cdecl подходит для C++ DLL, я думаю, вы хотите StdCall. – Cody

+1

Спасибо @Cody. Я использовал Walker Dependency и обнаружил, что он не может получить некоторые связанные зависимости. Я добавил их в папку C: \ Windows \ System32 и добавил это в переменную среды «Путь». Теперь я могу пройти мимо этой ошибки. Спасибо. – Teja

ответ

0

Неуправляемые DLL должны быть найдены в вашем управляемом процессе. Обычно это означает размещение DLL в том же каталоге, что и исполняемый файл. Но вы дали использовать абсолютный путь, который, как я полагаю, вы правильно транскрибировали.

Вы также можете столкнуться с этой ошибкой, если не удается найти зависимости DLL. Это кажется вероятным объяснением здесь. Скорее всего, среда выполнения MSVC не может быть установлена ​​при загрузке вашей DLL.

Использование абсолютного пути - отличная идея. Это сломается при распространении на другую машину. Используйте только имя файла DLL и поместите его в тот же каталог, что и исполняемый файл.

Ваш атрибут DllImport кажется суетливым. Нет смысла указывать CharSet, когда текст отсутствует. Я сомневаюсь, что ваша функция вызывает SetLastError. И вам действительно нужен ExactSpelling?

+0

Я обновил строку DllImport до - [DllImport («ctxmix.dll», CallingConvention = CallingConvention.Cdecl)] А также разместил dp cpp в том же месте, что и exe. Но я все равно получаю ту же ошибку. Я запускаю это с помощью VS2015. Итак, я полагаю, что это должно занять все связанные с ним зависимости правильно? Кроме того, я не вижу DLC CPP в разделе «Ссылки на проекты». Интересно, может ли это быть проблемой? – Teja

+0

Нет, вам не нужна DLL в качестве ссылки. Либо DLL, либо его зависимости не могут быть найдены. –

+0

Спасибо @David. Я использовал Walker Dependency и обнаружил, что он не может получить некоторые связанные зависимости. Я добавил их в папку C: \ Windows \ System32 и добавил это в переменную среды «Путь». Теперь я могу пройти мимо этой ошибки. Спасибо. – Teja

Смежные вопросы