如何在C#dll中保持对象“持久”?

时间:2011-11-24 19:24:14

标签: c# object dll object-persistence

我在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实例?

我可能一直在寻找错误的方向。任何提示都表示赞赏。

2 个答案:

答案 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));

所以我将指针改为单个实例,一切都很好。感谢您的评论!