2012-01-31 64 views
1

我使用C++/CLI链接一个.NET应用程序和一个动态加载的C DLL。LNK2020当做一个可变的静态

到目前为止,对DLL的所有访问都是基于实例的。

namespace NxCore { 
    public class NativeConnector { 

具有用于各种参考文献的方法变量:

 HMODULE hLib; 
     NxCoreProcessTape pfNxProcessTape; 
     NxCorePriceToDouble pfNxPriceToDouble; 
     NxCoreGetDefinedString pfNxCoreGetDefinedString; 
     NxCoreGetSymbolAtom32 pfNxGetSymbolAtom32; 
     NxCoreStateGetMMQuotes pfNxStateGetMmQuotes; 

予加载这些在一个连接方法:

hLib = ::LoadLibrary("NxCoreAPI.dll"); 

然后

pfNxProcessTape = (NxCoreProcessTape)::GetProcAddress(hLib, cszNxCoreProcessTape); 
    pfNxPriceToDouble = (NxCorePriceToDouble)::GetProcAddress(hLib, cszNxCorePriceToDouble); 
    pfNxCoreGetDefinedString = (NxCoreGetDefinedString)::GetProcAddress(hLib, cszNxCoreGetDefinedString); 

现在我需要将它移动到多个实例,所以我想加载第一次连接,在上次断开连接时卸载。这意味着变量必须是静态的。

在C#中,我只是让它们变成静态的。我尝试之一:

static HMODULE hLib; 

和链接失败:

4> NativeConnector.obj:错误LNK2020:无法解析令牌(0A00006D) “私家车:静态结构HINSTANCE__ * NxCore :: NativeConnector :: HLIB”(? hLib @ NativeConnector @ NxCore @ Connectivity @ Tradex @@ 0PAUHINSTANCE __ @@ A)

任何想法如何解决它?头文件用于.cpp文件,因此 - 它不应该有不同的定义。

任何人都可以告诉他如何解决这个问题?正如我所说 - 我想要将变量设置为静态,然后使用“使用计数”来确保我在上次断开连接时释放。

+1

*你定义了静态成员吗​​? – 2012-01-31 19:45:46

+0

正如我所说 - 我在头文件中添加了一个“静态”。还有其他地方我必须定义它们吗?如果头文件(类定义)不是静态的,它就可以工作。 – TomTom 2012-01-31 20:31:12

回答

1

从显示的代码我不完全清楚问题是否在ref类(.NET类)或本机C++类中出现问题。

这里是我的建议假设本机类型:您需要定义声明的成员

  • struct X 
    { 
        static int s_data; 
    }; 
    
  • CPP来源:

    #include "X.h" 
    
    int X::s_data /* = 42 */; 
    

对于参考类型我会执行y期望静态语义与C#相同#