Вызов функции C ++ с использованием DllImport - PullRequest
2 голосов
/ 31 октября 2011

Это основной, как мне вызвать функцию SubscribeNewsFeed в следующем из C # DllImport?

class LogAppender : public L_Append
{
public:
    LogAppender()
        : outfile("TestLog.txt", std::ios::trunc | std::ios::out)
        , feedSubscribed(false)
    {
        outfile.setf(0, std::ios::floatfield);
        outfile.precision(4);
    }



    void SubscribeNewsFeed()
    {
        someOtherCalls();
    }

};

Я не могу понять, как включить имя класса при использовании DllImport в моей программе на C #:

 class Program
    {

        [DllImport("LogAppender.dll")]
        public static extern void SubscribeNewsFeed();

        static void Main(string[] args)
        {
            SubscribeNewsFeed();
        }
    }

Ответы [ 2 ]

4 голосов
/ 31 октября 2011

PInvoke нельзя использовать для непосредственного вызова функции C ++.Вместо этого вам нужно определить функцию extern "C", которая вызывает функцию PInvoke и PInvoke в эту функцию.Кроме того, вы не можете PInvoke в метод экземпляра класса.

C / C ++ Код

extern "C" void SubscribeNewsFeedHelper() {
  LogAppender appender;
  appender.SubscribeNewsFeed();
}

C #

[DllImport("LogAppender.dll")]
public static extern void SubscribeNewsFeedHelper();
1 голос
/ 31 октября 2011

P / Invoke не работает таким образом.Он может импортировать только Си-функции.Таким образом, существуют разные типы взаимодействия между управляемым (C #) и собственным (C ++) миром.Взаимодействие через COM было бы решением - обеспечение интерфейса C другим.

...