C # DLLImport для C ++ DLL - PullRequest
       5

C # DLLImport для C ++ DLL

4 голосов
/ 20 ноября 2011

У меня есть .dll, встроенная в C ++ / CLI и .NET. Поэтому он предназначен для приложений .NET. API - это набор оболочек, который использует управляемые типы, поэтому он является нативным. Я импортировал .dll и добавил функцию вроде:

[DllImport(@"maplib.dll")]
public static extern bool initialize(string a);

Когда я вызываю эту функцию в своем коде C #, она работает нормально, но если я хочу добавить другую функцию, например ..

[DllImport(@"maplib.dll")]
public static extern bool initialize(string a);
public static extern bool runfile(string a, string b);

Я получаю эту ошибку при запуске моей программы. Это связано со второй функцией:

"Не удалось загрузить тип 'myapp.main' из сборки 'myapp, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null', поскольку метод runfile не имеет реализации (без RVA)."

Почему возникает эта ошибка и как ее исправить?

Ответы [ 2 ]

14 голосов
/ 20 ноября 2011

Вы должны добавить атрибут DllImport дважды, если вы хотите две функции:

[DllImport(@"maplib.dll")]
public static extern bool initialize(string a);
[DllImport(@"maplib.dll")]
public static extern bool runfile(string a, string b);

Но если ваша dll - .NET, тогда почему бы просто не добавить к ней обычную ссылку и использовать ее так, как выиспользовать код C #?

2 голосов
/ 21 ноября 2011

Насколько я понимаю, вы создали библиотеку управляемых классов, реализованную на C ++. Вы хотите использовать эту библиотеку классов (сборку) в другом управляемом коде (написанном на C #, VB.NET и т. Д.). В настоящее время вы экспортировали некоторые методы (ваш API) как собственные вызовы C ++:

public bool initialize(string a) {
    // ...
}

public bool runfile(string a, string b) {
    // ...
}

Это полезно, если вы хотите иметь возможность вызывать вашу библиотеку из собственного кода C ++, но если вы хотите использовать только управляемый код для вызова своей библиотеки, я предлагаю вам создать свой API как управляемый код:

public ref class MyLibraryFunctions {
    public:
        static bool initialize(string a);
        static bool runfile(string a, string b);
};

Таким образом, вам не нужно DllImport в вашем коде C #. Вы можете просто сделать:

using Something.MyLibrary;
....
    public void doSomethingThatNeedsMyLibrary() {
       MyLibraryFunctions.initialize(someString);
    }

Надеюсь, я правильно понял ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...