C#-C互操作性

C#-C互操作性,c#,c,interop,C#,C,Interop,在这里的Q/A与我想要的非常接近,但我只是从C#开始,需要更多的填写,可能还需要一些关于最佳方式的提示 我用Javascript为PalmPre/webOS编写了一个应用程序,其中一部分是用C编写的,是为了便于移植,而不是为了性能。它进行Lear Jet性能计算 在webOS世界中,C代码(插件)在自己的过程中运行,JS可以调用C代码(使用“main”)来启动过程,C可以注册入口点。然后JS可以使用一些参数调用入口点,C代码进行计算,然后C将一个指向字符串的指针返回给JS显示。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),以完成与Pre上的JS现在所做的相同的事情

答案1/选项2我认为是最好的,但我不明白他所说的“你的项目vs消费者项目”是什么意思,以及这意味着一个是dllimport,一个是dllexport,我没有DLL,我只有C代码例程。看起来我要做的就是用我的C例程替换他的“PublicFunc”,对吗?我可以有很多参数,上面写着“params”?但是没有指定返回类型,如何返回C#的答案?“returntype”是保留字吗?或者一个例子占位符?还是因为我没有DLL而偏离了轨道?顺便说一句,C代码确实有一种编译模式,可以作为DOS程序独立运行以进行测试

是否有任何简单的示例代码来说明如何做到这一点?我现在正在下载MS VS 2010 Express,尚未安装。也许有什么事

蒂亚

我从这里开始:


。。。请务必选择必要的VS版本(2005/2008/2010).:)

多亏了每个人的回答,每件事都有一点答案。因此,对于那些有同样问题的人,我将发布我编写的代码,以试验我所需要的链接

//这是C代码:

} }


//以下是C代码(DLL):

#包括
char astring[50];
//传递结构指针信息:http://www.adp-gmbh.ch/win/misc/mingw/dll.html
外部“C”
{uuu declspec(dllexport)
char*dodl(长a、长b、浮点*aptr、char*sa、char*sb)
{
浮点数[3];
nums[0]=*aptr;
nums[1]=*(aptr+1);
nums[2]=*(aptr+2);
sprintf(astring,“构建字符串:%s%s%ld,nrs为%2.1f,%2.1f,%2.1f。\n”,
sa,sb,(a+b),nums[0],nums[1],nums[2]);
printf(“内部DLL:%s\n”,astring);
回程收缩;
}
}

附录。。。我最近发现WindowsPhone7c#/XAML不支持与C/C++的链接,所以我想做的事情就泡汤了。显然,所有的东西都必须用C语言,我不会用C语言重写我所有的图形分析代码和数据库,所以我会转向Android。

在“你的项目”中,他指的是C/C++DLL项目;“消费者项目”是那些将使用DLL的项目。他的例子假定消费者使用C++导入DLL,但您的消费者是C.*,它具有类似的(但不同的)导入机制:此外,您需要为C语言使用DLC来导出C代码。code>returntype不是保留字;对于导出,
MYPROJECTAPI(int)foo()扩展到此文本:
extern“C”int\uu stdcall\uu declspec(dllexport)foo()
returntype
参数很愚蠢,因为返回类型不必在
\uu stdcall\uu declspec
之前。实际上,您可以从宏中删除param,并像这样使用它:
MYPROJECTAPI int foo()如果我没看错的话,msdn链接是针对C++->C链接的,有没有类似的东西来说明C#->C的魔法咒语细节?哦,你说得对。在任何情况下,C#也使用
DllImport
属性。这里有一个C#/C示例的链接(滚动到底):是的,更像是这样!当我需要它时,我必须消化它。我很惊讶,他们会在初学者教程中包含一个C#/C链接示例,听起来这是一件很常见的事情。我在别处听到的所有消息都说Windows Phone不支持C#-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");
}
#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;
}
}