c# – 在没有静态方法的情况下创建c DLL

我在C中创建一个DLL.这是一个例子:

namespace MathFuncs
{
  class MyMathFuncs
  {
    public:
        // Returns a + b
        static __declspec(dllexport) double Add(double a, double b);

        // Returns a - b
        static __declspec(dllexport) double Subtract(double a, double b);

        // Returns a * b
        static __declspec(dllexport) double Multiply(double a, double b);

        // Returns a / b
        // Throws DivideByZeroException if b is 0
        static __declspec(dllexport) double Divide(double a, double b);
    };
}

所有方法都是静态的,静态方法有很多限制,所以我的问题是如何在没有静态方法的情况下实现相同的方法?我总是需要在DLL中使用静态方法吗?我想在C#和IOS应用程序中导入此DLL.

解决方法:

作为附注,我几天前做过一次实验,mingw / c可以为你澄清.

我有一个全局参考计数器,用于查找程序中的内存泄漏,

class ReferenceCounter /** other implementations details are omitted.*/
{
public:

static int GlobalReferenceCounter;

//version 1
static int getReferenceCount1() { return GlobalReferenceCounter;}

//verison 2
static int getReferenceCount2(); //same code of version 1 but moved into .cpp file
};

当使用引用计数器将我的库编译到DLL中时,该变量是重复的,1个版本被编译到DLL中,并且一个版本在客户端代码中编译.

当我从DLL的工厂方法询问引用计数的东西时,只增加/减少DLL内部的引用计数器.当客户端代码使用从Ref Counter继承的自己的类时,则增加/减少客户端引用计数器.

因此,为了检查内存泄漏,我必须在程序结束时执行

assert(ReferenceCounter.getReferenceCount1() == 0);
assert(ReferenceCoutner.getReferenceCount2() == 0);

那是因为在内存泄漏的情况下,其中一个值将大于0.如果第一个值大于1,则内存泄漏是由未分配的用户类引起的,如果第二个值大于0,则内存泄漏是由库引起的类.

请注意,如果泄漏是由未分配的库的类引起的,则这不一定是库的错误,因为用户仍然能够泄漏该类,即使这应该意味着库中缺少设计,因为理想情况下应该返回每个类在适当的智能指针安全.)

当然你应该指定“GlobalReferenceCoutner”在文档中重复,否则一些不知情的用户可以认为2个getter是多余的并且会认为你做错了. (如果可能的话,避免做那样的事情,模糊不清)

这也应该警告你,通过DLL访问静态方法是非常不安全的.例如,如果在我的班级中我想只有1个参考计数器而不是2个我必须这样做才能获得安全性:

class ReferenceCounter
{
public:

static int GlobalReferenceCounter;

static void duplicate() { increaseGlobalCounter(); }

static void release() { decreaseGlobalCounter(); }

static int getGlobalCounter() { return privateGetGlobalCounter(); }

private:

static increaseGlobalCounter(); // implementation into Cpp file

static decreaseGlobalCounter(); // implementation into Cpp file

static privateGetGlobalCounter(); // implementation into Cpp file

};

这样做会授予您在DLL边界和用户应用程序中使用相同的值.所以我们不是在这里使用2个不同的变量而是使用1个变量(可能GlobalCounter仍然被编译成用户可执行文件,但是没有人使用它来删除“克隆效果”)

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...