C# - C互操作性

时间:2011-01-18 00:23:05

标签: c# c interop

link text的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!

3 个答案:

答案 0 :(得分:3)

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

//这是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 <stdio.h>
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;
}
}

答案 1 :(得分:0)

我会从这里开始: MSDN on Interop

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

答案 2 :(得分:0)

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