2012-05-02 77 views
0

我有一些代码在C++(www.NR.com功能),我想在SQL Server 2008 R2 CLR SP中使用。试图在C#中做一个包装,但没有运气。也许有人有一个工作样本或手册如何制作这样的包装并设置所有必需的编译器/链接器选项?CLR SP与非托管代码

感谢

+0

没有答案,但[提示](http://social.msdn.microsoft.com/Forums/en/sqlnetfx/thread/4a032c4b-1402-4c53-b34e-8c8bd724f904),也许。 –

回答

3

MSDN拥有所有的信息,以马歇尔从本机代码的参数管理的.NET

http://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx

http://msdn.microsoft.com/en-us/library/z6cfh6e6(v=vs.71).aspx

本文介绍了如何消耗非托管代码(C++类)

http://www.codeguru.com/cpp/cpp/cpp_managed/interop/article.php/c6867/Consuming-Unmanaged-C-Class-Libraries-from-NET-Clients.htm

64位本地代码有一个问题(在本文中没有提到,因为它在amd64的实际应用之前)。链接器参数必须调整,我只通过试验和错误做到这一点。

第二个想法,与NR.com的事情更简单。 您可以使用所需的所有功能创建.DLL。这被称为P/Invoke,它比上面提到的C++/CLI解决方案简单得多。

基本上,C代码一样

extern "C" void do_something_with_numbers(double* array, int len); 

创建Wrapper.DLL使用此功能导出。

然后在C#中,你只需要声明

class MyNRWrapper 
{ 
    [DllImport("WrapperDLL.dll", EntryPoint="do_something_with_numbers")] 
    public static extern void DoSomething([MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)] double [] array, int size); 
}; 

遇到可能来自一个事实,即在DLL你忘了声明函数为extern“C”,他们成为了C++编译器错位的问题。使用CFF资源管理器工具并查看Wrapper.DLL的“导出”部分,以查看它是否实际上具有要导出的函数。如果名称被损坏,请添加extern“C”修饰符或更改C#中的EntryPoint名称。

+1

感谢维克多,看起来我们设法使它工作! –