C # импортирует C ++ dll - PullRequest
       25

C # импортирует C ++ dll

2 голосов
/ 29 августа 2011

У меня есть управляемый файл DLL, который импортирует функции из DLL C ++ в управляемую среду.Я использую некоторые из его функций в своей программе, но проблема в том, что я получаю эту ошибку, когда использую ее:

Невозможно загрузить DLL 'Libraries \ lib.dll': указанный модуль не найден,(Исключение из HRESULT: 0x8007007E)

Я поместил файл .dll в каталог программы и в папку system32.Тем не менее, это все еще не работает.Я думаю, что я должен использовать DLLImport, но я не знаю, как его использовать .. даже после просмотра некоторых примеров я все еще в замешательстве.Может ли кто-нибудь помочь мне здесь?

Ответы [ 4 ]

2 голосов
/ 29 августа 2011

Здесь недостаточно информации, чтобы помочь, поскольку вы не показываете API (в нативном коде), который пытаетесь импортировать и т. Д.

При этом я настоятельно рекомендуюПрочтите Учебное пособие по платформе , а также Подробное описание Платформы по вызову в MSDN.Они знакомят с основными проблемами, а также демонстрируют множество примеров того, как импортировать и использовать функции из DLL C ++.

1 голос
/ 01 сентября 2011

Вы говорите:

Я поместил файл .dll в каталог программы ...

Но:

Невозможно загрузить DLL 'Libraries \ lib.dll'

Нам нужно увидеть создание вашего атрибута DLLImport, то есть сигнатуру C # нативного метода. Похоже, вы указали путь, т. Е.

[DLLImport( "Libraries\lib.dll" )];
static extern void MyNativeMethod();

Попробуйте использовать это вместо:

[DLLImport( "lib.dll" )];
static extern void MyNativeMethod();

Он будет искать работающий каталог, а также через переменную окружения PATH. Если вы укажете путь к файлу, как вы, я, честно говоря, не знаю, будет ли он искать через PATH, если файл не найден (я не смог найти упоминание о нем в документах ). 1026 *

0 голосов
/ 13 апреля 2017
The best and easiest way of using a c++ dll file in c# :-


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace demo1
{
    class Program
    {
        [DllImport("shi.dll", EntryPoint = "?HelloWorld@@YAXXZ")]
       public static extern int HelloWorld();
      public  static void Main(string[] args)
        {
            //Console.WriteLine(StringUtilities.HelloWorld());
            Console.WriteLine(HelloWorld());
            // public static extern void HelloWorld();
           //  HelloWorld();
            //  Console.ReadKey();
        }
    }
}
0 голосов
/ 01 сентября 2011

Если вы уверены в экспорте (используйте обходчик зависимостей для проверки) и что вы правильно сопоставили их, используя правильные вызовы PInvoke, то ваша проблема может быть связана с 32/64 битами, особенно если в 64-битной ОС с приложением .NET, установленным на Любой ЦП.

32-битная собственная DLL может быть загружена только 32-битным процессом .NET при использовании PInvoke (то же самое относится и к 64-битным собственным DLL).

Вы можете изменить цель платформы, используя Свойства-> Построить-> Цель платформы, или вы можете использовать утилиту CorFlags .

...