我使用C ++ / CLI在.NET应用程序和动态加载的C dll之间进行链接。
到目前为止,对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)“private:static struct HINSTANCE__ * NxCore :: NativeConnector :: hLib”(?hLib @ NativeConnector @ NxCore @ Connectivity @ Tradex @@ 0PAUHINSTANCE __ @@ A)
任何人都知道如何修复它?头文件用于.cpp文件,因此 - 它不应该有不同的定义。
任何人都可以告诉他如何解决这个问题?正如我所说 - 我想将变量移动为静态,然后自己使用“使用计数”来确保我在最后一次断开时释放。
答案 0 :(得分:1)
从显示的代码中我不清楚是否在ref class(.NET类)或本机C ++类中出现问题。
这是我的建议,假设一个本机类型:你需要定义声明的成员
头
struct X
{
static int s_data;
};
cpp来源:
#include "X.h"
int X::s_data /* = 42 */;
对于ref类型,我实际上期望静态的语义与C#
相同