C#-C互操作性

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#进行细微调整(#if)的C代码来执行与JS相同的操作Pre现在开始.

答案1 / option2我认为是最好的,但是我不明白他所说的“您的项目与消费者项目”的含义,以及为什么/为什么这意味着一个是dllimport,一个是dllexport,而我没有DLL ,我只有C代码例程.看来我要做的就是用我的C例程替换他的“ PublicFunc”,对吗?我可以在其中标有“ params”的地方使用多个args吗?但是,没有指定返回类型,我该如何返回C#的答案? “ returntype”是保留字吗?还是示例占位符?还是因为没有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 <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;
}
}
上一篇:Scala无法访问Java方法


下一篇:Java垃圾回收基础