C# – C互操作性

链接文本的Q / A非常接近我正在寻找的内容,但我只是开始使用C#并需要更多填写,并可能提供一些关于最佳方法的提示。

我有一个我用Javascript写的PalmPre / webOS的应用程序,其中一部分用C语言编写,以实现可移植性,而不是性能。 它做Lear Jet性能计算。

在webOS世界中,C代码(插件)进入自己的进程,JS有一种方法可以调用和调用C代码(使用’main’)来启动进程,C可以注册入口点。 然后JS可以使用一些参数调用入口点,C代码进行计算,然后C返回指向JS的数字字符串的指针以供显示。 C代码没有图形,没有动态内存分配等。我想基本上将JS GUI代码转换为C#,并使用C代码对C#进行小调整(#if’s)来做与JS相同的事情Pre现在做了。

答案1 / option2我认为最好,但我不明白他的意思是“你的项目与消费者项目”以及如何/为什么这意味着一个是dllimport,一个是dllexport,我没有DLL ,我只有C代码例程。 看起来我要做的就是用我的C例程替换他的’PublicFunc’,对吧? 我可以有一些args,它说’params’? 但是没有指定返回类型,我将如何返回C#的答案? “返回型”是一个保留字吗? 或者一个例子占位符? 或者我离开赛道因为我没有DLL? 顺便说一句,C代码确实有一种编译模式,可以独立运行作为DOS程序进行测试。

是否有任何简单的示例代码说明如何执行此操作? 我现在正在下载MS VS 2010 Express,还没有安装它。 也许那里有什么东西?

TIA!

感谢所有回答的人,一切都没有答案。 所以对于那些可能跟我问过同样问题的人,我会发布我写的代码来试验我需要的链接。

//这是C#代码:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; // DLL support namespace ConsoleApplication1 { class Program { [DllImport("dodll.dll", CallingConvention = CallingConvention.Cdecl)] [return: MarshalAs(UnmanagedType.LPStr)] private static extern string dodll(int a, int b, [MarshalAs(UnmanagedType.LPArray)] float[] nums, [MarshalAs(UnmanagedType.LPStr)] string strA, [MarshalAs(UnmanagedType.LPStr)] string strB); static void Main(string[] args) { int x = 2; int y = 3; float[] numbers = new float[3]{12.3F, 45.6F, 78.9F}; float[] simargs = new float[20]; string strvarA = "Test string A"; string strvarB = "Test another string"; string answer = dodll(x, y, numbers, strvarA, strvarB); Console.WriteLine("hello world " + answer); Console.WriteLine("another hello world" + x); Console.WriteLine("End of sim"); } 

}}


//这是C代码(DLL):

 #include  char astring[50]; //Passing structure pointer info: http://www.adp-gmbh.ch/win/misc/mingw/dll.html extern "C" { __declspec(dllexport) char* dodll( long a, long b, float* aptr, char* sa, char* sb) { float nums[3]; nums[0] = *aptr; nums[1] = *(aptr+1); nums[2] = *(aptr+2); sprintf(astring, "Building string: %s %s %ld, nrs are %2.1f, %2.1f, %2.1f.\n", sa, sb, (a+b), nums[0], nums[1], nums[2]); printf("Inside DLL: %s\n", astring); return astring; } } 

我将从这里开始: 在Interop上的MSDN

…一定要选择必备的VS版(2005/2008/2010)…… 🙂

附录……我最近发现Windows Phone 7 C#/ XAML不支持使用C / C ++进行链接,这样就可以打破我想做的事情。 显然一切都必须在C#中,我不会用C#重写我所有的图形分析代码和数据库,所以我将继续使用Android。