C#涉及多个项目时的非托管出口(Robert Giesecke)

我有这种情况,我需要在.Net中创建一个可以从delphi程序调用的非托管DLL。 我一直在做一些研究,我找到了Robert Giesecke的图书馆(RGiesecke.DllExport)。 我从一个非常简单的DLL开始,它显示一个带有文本框的窗体,如下所示:

[ComVisible(true)] [DllExport("PlaceOrder", CallingConvention = CallingConvention.StdCall)] public static IntPtr PlaceOrder(IntPtr lnpInXml) { string inputXml = Marshal.PtrToStringAnsi(lnpInXml); StringBuilder sbOutputXml = new StringBuilder(); Form1 pti = new Form1(inputXml, sbOutputXml); pti.ShowDialog(); return Marshal.StringToHGlobalAnsi(sbOutputXml.ToString()); } 

这工作正常,我设置delphi程序来调用我的DLL,它工作得很好。 当我在我的解决方案中添加对另一个项目的引用并在该项目中创建对象的实例时,问题就出现了。 此时,delphi程序停止显示表单,就像它找不到导出的函数但它不会抛出任何错误:

 using MyCommonCode; namespace UnmanagedDLLTest { [ComVisible(true)] public static class UnmanagedDLL { [ComVisible(true)] [DllExport("PlaceOrder", CallingConvention = CallingConvention.StdCall)] public static IntPtr PlaceOrder(IntPtr lnpInXml) { string inputXml = Marshal.PtrToStringAnsi(lnpInXml); StringBuilder sbOutputXml = new StringBuilder(); Form1 pti = new Form1(inputXml, sbOutputXml); pti.ShowDialog(); MyCommonCode.MyClass mc = new MyCommonCode.MyClass(); return Marshal.StringToHGlobalAnsi(sbOutputXml.ToString()); } } } 

这一行:

MyCommonCode.MyClass mc = new MyCommonCode.MyClass();

是我的问题的根源,一旦我评论它一切都有效。 我一直在google上寻找这样的例子,但我发现的一切与我的第一段代码类似。 在这一点上我会非常感激任何想法,我开始认为这是不可能的:(。

问候。

我有同样的问题。 在我的例子中,我试图从Visual FoxPro应用程序调用C#DLL。 只要方法调用外部DLL,FoxPro应用程序就会返回错误/exception。

我建议您从另一个StackOverflow问题中遵循本指南 。 基本上:

  1. 创建一个COM可见的C#dll
  2. 使用regasm在部署机器上注册DLL