我已经写在VC++ 6服务包6.一个Win32 DLL让我们把这个DLL作为FirstLayer。我没有访问FirstLayer的源代码,但我需要从托管代码中调用它。问题是,FirstLayer大量使用std :: vector和std :: string作为函数参数,并且没有办法将这些类型直接封装到C#应用程序中。
Second_Layer
,我能想到的是先创建写在VC++ 6.0的Service Pack 6另一个win32的DLL让我们把这个DLL作为 “SecondLayer” 的解决方案。 SecondLayer充当FirstLayer的包装。此图层包含std :: vector的包装类,因此std :: vector不会在此图层中的所有函数参数中显示。我们把std :: vector的这个包装类称为StdVectorWrapper。
该层不使用任何新的或删除操作来分配或释放内存,因为这是由std :: vector在内部处理的。
Third_Layer
我还创建了一个VC++ 2005类库作为SecondLayer的包装。这个包装器完成将非托管SecondLayer转换为托管代码的所有肮脏工作。我们把这个图层称为“ThirdLayer”。
与SecondLayer类似,该层在处理StdVectorWrapper时不使用new和delete。
Fourth_Layer
更有甚者,我创建了一个C#2005控制台应用程序调用ThirdLayer。我们将这个C#控制台应用程序称为“FourthLayer”。
呼叫序列总结
FourthLayer(C#2005) - > ThirdLayer(VC++ 2005) - > SecondLayer(VC 6) - > FirstLayer(VC 6)
的问题
我注意到,“System.AccessViolationException:尝试读取或写入受保护的内存”异常被抛出,我怀疑是由于SecondLayer内部的std ::矢量分配内存whic h对于ThirdLayer访问非法。
这证实了我的想法,因为当我在VC++ 2005中重新编译FirstLayer(模拟)和SecondLayer时,问题完全消失。但是,重新编译FirstLayer的生产版本是不可能的,因为我没有源代码。
我听说为了摆脱这个问题,我需要在C++中为StdVectorWrapper类中的SecondLayer的std :: vector编写共享内存分配器。我不完全明白为什么我需要共享内存分配器以及它如何工作?任何想法?
在互联网上是否有任何现成的源代码,我可以在SecondLayer中编译和使用我的代码?
请注意,我无法为此使用boost库。
2009-12-06
Lopper
+0
忘记我的第一个答案。那是错的。 –
2009-12-07 22:30:59