带有非托管代码的CLR SP

时间:2012-05-02 06:22:19

标签: c++ sql-server-2008-r2 sqlclr clrstoredprocedure

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

由于

1 个答案:

答案 0 :(得分: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 Explorer工具,查看Wrapper.DLL的Export部分,看看它是否确实具有您要导出的功能。如果名称被破坏,则添加extern“C”修饰符或更改C#中的EntryPoint名称。