加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

.net – 如何在VS版本中制作一致的dll二进制文件?

发布时间:2020-12-13 20:39:44 所属栏目:Windows 来源:网络整理
导读:例如,winsock libs在所有版本的visual studio中都能很好地工作.但是我在为所有版本提供一致的二进制文件方面遇到了麻烦.使用VS 2005编译的dll在链接到2008年编写的应用程序时将无法工作.我将2k5和2k8升级到SP1,但结果没有太大变化.它的工作原理还可以.但是当
例如,winsock libs在所有版本的visual studio中都能很好地工作.但是我在为所有版本提供一致的二进制文件方面遇到了麻烦.使用VS 2005编译的dll在链接到2008年编写的应用程序时将无法工作.我将2k5和2k8升级到SP1,但结果没有太大变化.它的工作原理还可以.但是当他们将这个包含在C#应用程序中时,C#应用程序会出现访问冲突错误,但使用经典的C应用程序它可以正常工作.

当我提供dll时,我应该知道一个策略吗?

首先,除了传递DLL边界的普通旧数据之外,不要传递任何其他内容.结构很好.课不是.
其次,确保所有权不被转移 – 即,通过dll边界传递的任何结构都不会在dll之外被释放.因此,如果您导出X * GetX()函数,则会有相应的FreeX(X *)类型函数,确保分配的相同运行时负责取消分配.

下一步:获取DLL以链接到静态运行时.将来自多个第三方的dls组合在一起,每个第三方链接并期望不同的运行时,可能与应用程序预期的运行时不同,这是一种痛苦,可能会迫使安装程序软件安装7.0,7.1,8.0和9.0的运行时 – 其中一些存在于不同的服务包中,这可能会或可能不会引起问题.善待 – 静态链接你的dll项目.

– 编辑:
您无法使用此方法直接导出c类.在模块之间共享类定义意味着您必须具有同类运行时环境,因为不同的编译器或编译器版本将以不同方式生成装饰名称.

您可以通过将类导出为COM样式接口来绕过此限制…也就是说,虽然您无法以独立于运行时的方式导出类,但您可以导出“接口”,您可以通过声明来轻松实现一个只包含纯虚函数的类……

struct IExportedMethods {
    virtual long __stdcall AMethod(void)=0;
  };
  // with the win32 macros:
  interface IExportedMethods {
    STDMETHOD_(long,AMethod)(THIS)PURE;
  };

在您的类定义中,您从此接口继承:

class CMyObject: public IExportedMethods { ...

你可以通过制作C工厂方法来导出这样的接口:

extern "C" __declspec(dllexport) IExportedClass* WINAPI CreateMyExportedObject(){
    return new CMyObject; 
  }

这是一种非常轻量级的导出编译器版本和运行时独立类版本的方法.请注意,您仍然无法删除其中一个.您必须包含释放功能作为dll或接口的成员.作为界面的成员,它可能如下所示:

interface IExportedMethods {
    STDMETHOD_(void) Release(THIS) PURE; };
  class CMyObject : public IExportedMethods {
    STDMETHODIMP_(void) Release(){
      delete this;
    }
  };

您可以采用这个想法并继续使用它 – 从IUnknown继承您的接口,实现ref计数AddRef和Release方法以及查询接口或其他功能的QueryInterface的能力.最后,使用DllCreateClassObject作为创建对象并获得必要COM注册的方法.所有这些都是可选的,但是,您可以轻松地通过C函数访问简单的接口定义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读