【问题标题】:C# - C interoperabilityC# - C 互操作性
【发布时间】:2011-07-24 00:22:35
【问题描述】:

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 现在可以了。

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

是否有任何简单的示例代码可以说明如何做到这一点?我现在正在下载 MS VS 2010 Express,还没有安装。也许那里有什么东西?

TIA!

【问题讨论】:

  • 通过“你的项目”,他说的是C/C++ DLL项目; “消费者项目”是那些将使用 DLL 的项目。他的示例假设消费者使用 C++ 导入 DLL,但您的消费者是 C#,它具有类似(但不同)的导入机制:msdn.microsoft.com/en-us/library/aa984739%28VS.71%29.aspx
  • 另外,您需要一个 C 代码的 DLL 导出,以便 C# 使用它。 returntype 不是保留字;对于导出,MYPROJECTAPI(int) foo(); 扩展为以下文本:extern "C" int __stdcall __declspec(dllexport) foo();returntype 参数是愚蠢的,因为返回类型不必在 __stdcall __declspec 之前。您实际上可以完全从宏中删除参数并像这样使用它:MYPROJECTAPI int foo();
  • 如果我没看错的话,那个 msdn 链接是用于 C++->C 链接的,有没有类似的东西来说明 C#->C 的神奇咒语细节?
  • 哦,你是对的。无论如何,C# 也使用DllImport 属性。这是一个带有 C#/C 示例的链接(滚动到底部):csharphelp.com/2006/12/c-tutorial-for-beginners
  • 是的,这更像它!当我需要它时,我将不得不消化它。我很惊讶他们会在初学者教程中包含一个 C#/C 链接示例,听起来这是很常见的事情。

标签: c# c interop


【解决方案1】:

感谢所有回答的人,一切都有答案。因此,对于那些可能在我之后提出相同问题的人,我将发布我编写的代码来试验我需要的链接。

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

【讨论】:

    【解决方案2】:

    我将从这里开始: MSDN on Interop

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

    【讨论】:

    • 我在别处听到的都说Windows Phone不做C#-C联动,所以如果你有相反的信息,请告诉我。我在您提供的链接中没有找到任何相关内容。谢谢!
    【解决方案3】:

    附录...我最近发现 Windows Phone 7 C#/XAML 不支持与 C/C++ 的链接,所以这让我想做的事情失去了意义。显然一切都必须在 C# 中,我不会用 C# 重写我所有的图形分析代码和数据库,所以我将继续使用 Android。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多