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

时间:2014-01-27 05:52:37

标签: c# export unmanaged

我遇到这种情况需要在.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上寻找这样的例子,但我发现的一切与我的第一段代码类似。在这一点上我会非常感激任何想法,我开始认为这是不可能的:(。

问候。

1 个答案:

答案 0 :(得分:1)

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

我建议您follow this guide from another StackOverflow question。基本上是:

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