这两天被一个.Net Interop的问题困扰着,之前没有问题的代码,突然出现了如下的错误:
Could not load file or assembly 'Interop.SterlingLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An attempt was made to load a program with an incorrect format.
这个提示似乎看不出有用的信息,只好逐步排除了:
1 检查编译输出文件,都在
2 检查svn log,没有发现错误的修改提交
3 回滚版本。我机器上有前几天编译的binary,发现可以用,于是对不同日期的Interop.SterlingLib.dll进行hex比较,发现不一样。这个就很奇怪了,因为COM typelib没有变化,工程设置都是Any CPU,所以不应该有差异。
4 GOOG之,发现如下解释:
Tip of the day: "An attempt was made to load a program with an incorrect format" .NET P/INVOKE issue
于是将工程切换到x86,运行正常。
疑点:Sterling确实是x86的,为了避免Interop问题将我的工程设置成x86自然是应该的。但是,前天同样的操作系统(Win7 x64),同样的工程设置(Any CPU)为什么能用呢?太诡异了……C#是方便,但是这些诡异的问题真要命啊。