尝试包装PJSIP库以在具有CLR支持的C ++项目中使用它

时间:2014-08-17 15:30:29

标签: c++-cli wrapper pjsip

我试图在支持CLR的Visual C ++项目中使用PJSIP lirbrary。谷歌搜索了几个小时后,尝试我没有任何线索,为什么我的项目将无法编译。我会一步一步地告诉你我到目前为止做了什么,我希望你们能告诉我,我的配置有什么不对。

  1. 我从PJSIP存储库中检出了
  2. 我在Visual Studio 2013(Express)中打开了解决方案
  3. Visual Studio迁移了项目,迁移完成后,我能够编译PJSIP项目而没有进一步的问题,创建.LIB文件,PJSIP不使用CLR
  4. 之后,我创建了一个新的Visual C ++项目(使用CLR)并尝试访问PJSIP库。编译成功,但链接产生了许多错误(错误如:调用外部引用不可能......)
  5. 然后,谷歌意味着,无法从CLR支持的应用程序调用静态库的方法。我的错,我认为这很容易: - (
  6. 然而,我再次搜索,然后我发现有可能"包裹"使用CLR包装类调用PJSIP。此包装类嵌入在DLL中。我可以在我的Visual C ++项目中使用这个DLL(这是一个循序渐进的指南,我做了#3:http://social.msdn.microsoft.com/Forums/vstudio/en-US/299da822-5539-4e5b-9ba7-b614e564c9f4/presenting-a-c-library-lib-for-use-in-c-project?forum=vcgeneral
  7. 我可以创建包装类,编译得很好,创建了DLL。我也可以从我的Visual C ++项目中引用这个DLL,但是如果我尝试访问这些方法,Visual Studio编译器说,它并没有这些方法。

    关于stackoverflow有很多关于这个主题的问题,但是,没有答案解决了我的问题(即How to access class in C++/CLI from C#?

    这是一些代码,我希望这更清楚我的观点:

    #include <pjlib.h>
    #include <pjlib-util.h>
    #include <pjnath.h>
    #include <pjsip.h>
    #include <pjsip_ua.h>
    #include <pjsip_simple.h>
    #include <pjsua-lib/pjsua.h>
    #include <pjmedia.h>
    #include <pjmedia-codec.h>
    
    #pragma once
    
    using namespace System;
    
    namespace PJSIPCLRWrapper {
    
    public ref class pjsipWrapper
    {
        static int pjsipInit()
        {
        pj_status_t status;
    
        /* Must init PJLIB first: */
        // pj_init is a function from the PJSIP lib
        status = pj_init();
    
        return (int)status;
        }
    }
    

    #include "stdafx.h"
    
    using namespace System;
    
    
    int main(array<System::String ^> ^args)
    {   
        // this line procduces error C2882: 'PJSIPCLRWrapper': illegal use of namespace identifier in expression
        PJSIPCLRWrapper.pjsipWrapper.pjsipInit();
        return 0;
    }
    

    我整天搜索互联网如何解决问题。我有很多解决方案,但没有解决方案解决了我的问题。我很害怕,这是不可能的,或者我犯了一个可怕的错误。

    感谢您的帮助! 问候 卢卡斯

2 个答案:

答案 0 :(得分:0)

要在C ++ / CLI中调用静态函数,它应该是:

PJSIPCLRWrapper::pjsipWrapper::pjsipInit();

答案 1 :(得分:0)

我找不到任何我的问题的解决方案,除了我切换到Visual C ++而没有CLR支持我的程序。在这里,我可以使用没有包装器的完整PJSIP库。虽然,我不能利用CLR的优点: - /

祝你好运, 卢卡斯