2014-09-29 75 views
2

我需要创建一个可以从PowerBuilder 12.5中调用的dll。我在https://sites.google.com/site/robertgiesecke/Home/uploads#TOC-Samples找到了RGiesecke.DllExport页面。我创建了以下非常简单的C#项目作为一个控制台应用程序,并在向导中我选择的dll:RGiesecke dll导出模板

VS2013 framework 3.5 
Windows 7 

using System; 
using System.Collections.Generic; 
using System.Text; 
using RGiesecke.DllExport; 
using System.Runtime.InteropServices; 

namespace PRS 
{ 
    internal static class UnmanagedExports 
    { 
    [DllExport("getsmoochie", CallingConvention = CallingConvention.StdCall)] 
    static string GetSmoochie() 
    { 
     return "Success"; 
    } 
    } 
} 

我编译发布模式为32位,然后试图从PowerBuilder中与访问DLL:

Function string GetSmoochie() library "PRS.dll" 

我找回看起来像汉字的东西。

另外我发现有一点有点奇怪:如果我尝试使用Regsvr32注册dll,我会得到和错误告诉我没有dll入口点。我不知道该怎么想。

我有额外的PowerBuilder的DLL需求,但我似乎无法得到最简单的工作。任何帮助,将不胜感激。

谢谢。

UPDATE:

它发生,我认为得到一个错位的串回可能不是在这种情况下一个问题,因为代码我真的需要执行将文件发送到Web服务,所以我实现了SENDFILE()代码,它可以在PowerBuilder中运行。

我从上面的代码中做出的一个更改是在方法调用中添加关键字“public”。

总结:RGiesecke DLL导出模板的作品!

更新: 请参阅下面的注释。这是我与文件名调用中传递:

[DllExport("sendfile", CallingConvention = CallingConvention.StdCall)] 
public static long SendFile(String filename) 

由于与文件名的硬编码的作品我必须承担的文件名是越来越莫名其妙错位和DLL不能鱼翅它的代码。

任何想法?

+1

如果运行和的Depends.exe加载DLL建成,它表现出任何出口?它应该至少显示你的getsmoochie出口。 – DarinH 2014-09-29 20:56:49

+0

重新提出有关运行Regsvr32的问题,该工具通过在DLL本身中调用DLLRegisterServer入口点来工作。正常.net dll不会导出该入口点,因此Regsvr32将无用。另外,通常情况下,Regsvr32用于注册COM服务器dll,因此除非您导出COM对象,否则不需要通过regsvr32 – DarinH 2014-09-29 20:58:12

+0

注册dll。但是,可以自己创建和导出该入口点,然后拥有regsvr32可注册.net dll。但第一件事情第一:) – DarinH 2014-09-29 20:58:53

回答

1

你必须编组你的返回值。此代码的工作对我来说:

[DllExport("ExpTest", CallingConvention = CallingConvention.Winapi)] 
[return: MarshalAs(UnmanagedType.LPWStr)] 
public static string ExpTest([MarshalAs(UnmanagedType.LPWStr)] string sText, out int length) 
{ 
    MessageBox.Show(sText); 
    length=sText.Length; 
    return sText; 
} 

PB 11.5经典
目标框架.NET 4.5.2
目标平台86