0

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

谢谢

4

1 回答 1

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 的导出部分,看看它是否确实具有您要导出的功能。如果名称被破坏,请添加 extern "C" 修饰符或更改 C# 中的 EntryPoint 名称。

于 2012-05-02T08:16:58.443 回答