【问题标题】:Execute code on assembly load在程序集加载时执行代码
【发布时间】:2010-03-20 08:15:46
【问题描述】:

我正在为一些大型非托管库开发包装器。几乎它的每个函数都可以在内部调用一些错误处理程序。默认错误处理程序将错误写入控制台并调用 abort() 函数。这种行为对于托管库来说是不可取的,所以我想用我自己的替换默认的错误处理程序,它只会抛出一些异常,让程序在处理完这个异常后继续正常执行。在调用任何包装函数之前,必须更改错误处理程序。
包装器库是用托管 c++ 编写的,具有与包装库的静态链接,因此不存在像“具有数百个 dll 导入的类型”这样的东西。我也找不到包装库中所有内容都使用的单一类型。所以我不能通过在一种类型中定义静态构造函数来解决这个问题,它会执行我需要的代码。

我目前看到了两种解决该问题的方法:

  1. 定义一些静态方法,如 Library.Initialize(),在其代码使用包装库的任何部分之前必须由客户端调用一次。

  2. 找到每个顶级函数使用的最小类型子集(我认为这个子集的大小将类似于 25-50 个类型)并添加调用 Library.Initialize 的静态构造函数(这将在这种情况下是内部的)到每一种类型。

我已经阅读了thisthis 的问题,但它们并没有帮助到我。有没有解决这个问题的适当方法?也许有一些不错的技巧可用?

【问题讨论】:

    标签: .net assemblies


    【解决方案1】:

    其他几个建议:

    1. 创建一个抽象基类作为所有包装类的根,并将初始化调用放在基类的构造函数中。
    2. 为所有对象提供内部构造函数,并强制客户端通过某种工厂方法实例化它们,然后在返回对象实例之前执行初始化。

    【讨论】:

      【解决方案2】:

      我认为您的选项 2 更好。如果您将调用包含在一些额外的类型中,那就这样吧。当然,如果 Library.initialize 已经被调用,你会得到释放。

      【讨论】:

        【解决方案3】:

        可能有点牵强,但您可以创建自己的包装类,只公开您想要的功能。在每个函数中,您都可以执行错误处理。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多