我在C#中编写了一个dll,提供了一个可供使用的类。 dll由我编写的C程序调用。 (这是某个程序的插件。我必须在C中编写插件的代码,但我想使用.NET的功能,因此dll)。
在dll中,我想打开一个流,并做两个在dll调用之间应该持久化的东西。这由私有成员Connector在下面的代码中表示。
namespace myCSharpDll
{
// the c++ program calls this methods
public interface IAccess
{
double Initialize();
double Timestep(double time, double[] values);
...
}
// E is the beginning of another program my dll should connect to, therefore the names
public class EAccess : IAccess
{
// EConnector is another class I defined in the same dll
private EConnector Connector;
public double InitializeE()
{
Connector = new EPConnector();
}
public double Timestep(double time, double[] values)
{
return Connector.Connect();
}
当我调用InitializeE()以及稍后调用Timestep()时,Connector oject指向NULL。
当我从C代码调用Timestep()时,我可以做什么,我可以访问之前创建的Connector实例?
我可能一直在寻找错误的方向。任何提示都表示赞赏。
答案 0 :(得分:0)
如果我没有错,你想在c中使用dll时保持单个对象。如果是这种情况尝试类似于单身模式的东西。
http://en.wikipedia.org/wiki/Singleton_pattern
单身者强调的是,您只为一个类创建单个对象,并使用它来执行您需要的所有工作。基本上你可能需要一个像这样的函数,
public class EAccess : IAccess
{
private static EConnector Connector
public EConnector getConnector(){
if(Connector == null){
Connector = new EConnector();
}
return Connector;
}
public double Timestep(double time, double[] values)
{
return getConnector().Connect();
}
};
即使这不是使用单身人士做事的传统方式,但我认为它仍然可以完成工作。我可能错了。如果我误解了某些内容,请纠正我。
答案 1 :(得分:0)
感谢SLaks要求我的C / C ++代码。这就是问题所在。它比我想象的要简单。我把错误放在一起给你看错了。
我知道C和C ++不一样,插件结构有点奇怪。大多数代码都是由向导生成的。我只需要填写我的代码。它是一个cpp文件,但代码似乎是C.嗯,我认为这不是主题。
在这里,我引出了最重要的一行。
// the dll is connected via COM, using the type library file that regasm generated
#import "[path]\myCSharpDll.tlb" raw_interfaces_only
using namespace myCSharpDll;
static void OnActivate (IfmDocument, Widget);
//off topic: this are the weird lines the wizard put in my way
#ifdef __cplusplus
extern "C"
#endif /* __cplusplus */
// when the plugin is called by the host program, this function is called
static void OnActivate (IfmDocument pDoc, Widget button)
{
InitializeIntermediate(pDoc);
Timestep1(...);
}
static void InitializeIntermediate(IfmDocument pDoc)
{
// Initialize COM.
HRESULT hr = CoInitialize(NULL);
IEPAccessPtr pIEPAccess(__uuidof(EPAccess));
double result = -1;
pIEPAccess->InitializeEP (&result);
...
}
static void Timestep1(...)
{
IEPAccessPtr pIEPAccess(__uuidof(EPAccess));
double result = -1.1;
pIEPAccess->Timestep (...);
...
// now I get a wrong result back here, because this call leads to nowhere as
// the connector object in the dll is void
}
我意识到我正在请求第二行
IEPAccessPtr pIEPAccess(__uuidof(EPAccess));
所以我将指针改为单个实例,一切都很好。感谢您的评论!