Tag: delphi

使用stdcall创建可以在Delphi应用程序中导入的C#DLL – 可能吗?

我有一个程序,我需要创建一个DLL,希望在C#中。 该程序是用Delphi编写的,我有一个代码的接口文件。 该接口使用stdcall调用约定。 是否可以创建符合接口的C#DLL并可以在Delphi应用程序中使用? 是否有一些示例代码演示如何将C#DLL编码为stdcall接口方法?

从C#调用Delphi DLL会产生意外结果

我有一个Delphi DLL,我没有写,但需要从C#ASP.NET 3.5应用程序调用。 这是我从开发人员那里得到的函数定义: function CreateCode(SerialID : String; StartDateOfYear, YearOfStartDate, YearOfEndDate, DatePeriod : Word; CodeType,RecordNumber,StartHour,EndHour : Byte) : PChar; external ‘CreateCodeDLL.dll’; 这是我的C#代码: [DllImport( “CreateCodeDLL.dll”, CallingConvention = CallingConvention.StdCall, CharSet=CharSet.Ansi)] public static extern IntPtr CreateCode( string SerialID, UInt16 StartDateOfYear, UInt16 YearOfStartDate, UInt16 YearOfEndDate, UInt16 DatePeriod, Byte CodeType, Byte RecordNumber, Byte StartHour, Byte EndHour); 最后,我对这种方法的调用: //The Inputs String […]

将字符串从delphi dll返回到64位的C#调用者

我有一个C#应用程序,它使用以下代码调用本机Delphi dll: C# [DllImport(“NativeDLL.dll”, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] public static extern int GetString(string out str); delphi function GetString(out a: PChar): Integer; stdcall; begin a := PChar(‘abc’); Result := 1; end; 这在32位应用程序中工作正常。 但是当我为64位编译C#exe和Delphi dll时,我遇到了一个奇怪的问题。 在Delphi调试器中调用GetString之后,我可以看到.NET代码中某处出现exception,并且Debugger Output窗口中出现以下字符串: “检测到严重错误c0000374” 。 Google表示此错误与堆损坏有关。 我尝试使用ref / var参数修饰符而不是out / out。 仍然没有运气。 为什么我会收到此错误? 我应该为64位使用不同的调用约定吗? BTW。 以下组合工作正常: C# [DllImport(“NativeDLL.dll”, CharSet = CharSet.Unicode, […]

将C#COM服务器事件暴露给Delphi客户端应用程序

我的问题与这两个非常相似: C#组件事件? C# – 编写COM服务器 – 未在客户端上触发的事件 然而,对他们有用的不适合我。 类型库文件没有任何事件定义提示,因此Delphi没有看到它。 正如您所料,该类适用于其他C#应用程序。 COM服务器工具: Visual Studio 2010 .NET 4.0 Delphi应用程序: Delphi 2010 delphi7 这是代码的简化版本: /// /// Call has arrived delegate. /// [ComVisible(false)] public delegate void CallArrived(object sender, string callData); /// /// Interface to expose SimpleAgent events to COM /// [ComVisible(true)] [GuidAttribute(“1FFBFF09-3AF0-4F06-998D-7F4B6CB978DD”)] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface IAgentEvents { /// /// […]

如何在C#中使用Delphi Dll(带PChar类型)

这是Delphi DLL代码: library Project2; uses SysUtils, Classes; {$R *.res} function SimpleConv(const s: string): string; var i: Integer; begin Result := ”; for i := 1 to Length(s) do if Ord(S[i]) 0; end; procedure BlockFree(Buf: pchar); stdcall; begin if assigned(Buf) then FreeMem(Buf); end; exports MsgEncode, BlockFree; begin end. Dll函数MsgEncode将allocmem分配给pOut param,而BlockFree用于释放由MsgEncode分配的内存。 我的问题是: 我怎样才能在C#中使用这个dll? 我是C#的新手。

从delphi2006调用.net dll来显示wpf表单

我正在使用Robert Gieseckes伟大的Unmanaged Exports从Delphi2006调用ac#-Dll。 如果我使用输入和输出的简单过程和函数,一切都很好。 但现在我想通过调用OpenMyWindow()显示一个Wpf-Window。 在这里,我得到一个“外部例外E0434352”。 我不知道为什么这不起作用。 无论如何,我认为这与wpf方面的初始化有关。 这是Delphi代码: unit Unit2; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls; type TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; procedure OpenMyWindow(); stdcall; external ‘ClassLibraryToDelphi.dll’; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); begin OpenMyWindow(); end; end. 现在是c#部分(它是一个将UserControl改为窗口的ClassLibrary): using System.Linq; […]

32位dll导入64位.Net应用程序

我遇到了问题,我从昨天开始尝试解决它,但没有运气。 我有32位delphi dll,我想在.NET Win应用程序中导入。 此应用程序必须基于任何CPU模式构建。 当然,还有BadImageFormatException即将到来,这意味着在x64应用程序中无法加载x86 dll ..我用Google搜索并找到解决方案,它说我必须做包装,但对我来说还不清楚。 任何人都可以告诉如何解决这个问题,有没有可能的方法我可以在程序建立任何CPU或x64模式(可能是另一种解决方案)中导入32位Delphi dll。

Delphi类的C#

我知道之前已经问过这个问题,但我还没有看到一个简短明了的答案,所以我希望他们不会删除这个问题,现在我会得到一个明确的答案: 我目前在C#5.0工作; .NET 4.5; VS 2012.虽然我已经用C#做了很多,但我主要是Delphi人。 在Delphi中,我已经编写了数百个使用以下设计的类工厂(这里很简单): unit uFactory; interface type TClassofMyClass = class of TMyClass; TFactoryDict = TDictionary; var fDict:TFactoryDict; implementation procedure initDict; begin fDict:=TFactoryDict.create; fDict.add(myEnum1, TMyClass1); fDict.add(myEnum2, TMyClass2); fDict.add(myEnum3, TMyClass3); end; function Factory(const aEnum: TMyEnum): TMyClass; var ClassofMyClass: TClassofMyClass; begin if fDict.TryGetValue(aEnum, ClassofMyClass) then result := ClassofMyClass.Create(aParam); end; end. 现在:我如何在C#中做这样的事情?! 似乎C#中没有 ‘类’类型。 我错过了什么吗? […]

访问Delphi DLL抛出exceptionexception

当我调用Dll方法时,它有时会引发exception,有时则不会。 我这样称呼它: public class DllTest { [DllImport(@”MyDll.dll”)] public extern static string MyMethod(string someStringParam); } class Program { static void Main(string[] args) { DllTest.MyMethod(“SomeString”); } } 我有时得到的例外是: AccessViolationException 尝试读取或写入受保护的内存。 这通常表明其他内存已损坏。 有没有人知道我为什么有时会得到这个例外? 为什么有时会顺利运行?

如何在没有注册的情况下从Win32使用.Net程序集?

我想从Delphi Win32应用程序动态加载和使用在C#中创建的.Net程序集。 我的类和接口标记为ComVisible,但我想避免注册程序集。 这可能吗? PS我在这里找到链接文本关于该主题的另一个很好的讨论,但它更多地围绕托管CLR。 这引出了一个问题 – 为什么你要主持CLR而不是使用ClrCreateManagedInstance?