2009-06-13 56 views
2

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

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

  1. 这样定义Library.Initialize()必须由客户端调用之前的一次他的代码将使用包装图书馆的任何部分一些静态方法。

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

我读过thisthis问题,但他们并没有帮助我。有没有解决这个问题的适当方法?也许有一些很好的黑客可用?

回答

0

我认为你的选择2更好。如果你将呼叫包含在一些额外的类型中,那就这样吧。当然,如果Library.initialize已经被调用,那么你可以保留它。

0

虽然可能有点夸张,但是您可以创建自己的包装类,只展示您想要的功能。在每个这些功能中,您都可以执行错误处理。

1

一对夫妇的其他建议:

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