如何使用C#创建非托管DLL?

8
我想使用C#创建一个DLL,然后可以按以下方式从VBA中调用 -
Private Declare Function invokePath Lib "\\shared_computer\Projects\somedll\myDLL.dll" (ByVal strUName As String, ByVal strSFile As String) As String

这个想法是,如果DLL的路径被更改,我只需要更新Private Declare函数行中的路径即可...

我已经搜索了很多,也不确定是否可能实现这种安排 - 我们是否可以在不引用或注册的情况下从网络路径调用DLL函数。

4个回答

15

其实你可以这样做。 查看unmanagedexports, 它提供了完整的指导,你将能够创建类似于这样的入口点:

[DllExport("GenerateSomehting", CallingConvention = CallingConvention.Cdecl)]
public static int GenerateSomehting(int somevalue, ref IntPtr pointer)

你可以像调用其他非托管 DLL 一样调用它。

[DllImport("MyGenerator.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int GenerateSomehting(int somevalue, ref IntPtr pointer);

生成后,这个程序可以在任何地方运行,不需要 .NET 吗? - qakmak
是的,我曾经以这种方式构建dll,以便Delphi可以与其通信。 - Samball
1
被调用的函数能否利用其他.NET库? - ceds
我会试一试! - nabuchodonossor
1
在.NET Framework 4.5.2和平台目标x86上运行良好。已使用Delphi Pascal控制台应用程序进行测试。不适用于更新的框架4.6或4.7.2。 - Marcelo Bergweiler

4

使用C#无法创建非托管的DLL,因为C#是一种只能在.NET平台上运行的语言。请使用C++。

将.NET DLL用于非托管代码(例如VBA)的唯一方法是使用COM互操作。


尽管标题中提到了“未管理”,但问题正文中的请求(即创建一个可从VBA调用的C# DLL)非常容易实现。 - Uwe Keim
2
是的,但正如您所注意到的,我并没有说从VBA访问.NET DLL是不可能的。然而,问题是“如何在C#中创建非托管DLL”,这是不可能的。 - Thorsten Dittmar
那么是否有可能访问使用Private Declare Function创建的C# DLL,而不添加引用,例如:Private Declare Function invokePath Lib "\shared_computer\Projects\somedll\myDLL.dll" (ByVal strUName As String, ByVal strSFile As String) As String?要求保持路径的灵活性。如果不可能,我们必须转向C++。 - Amit Pandey
不可以通过你所描述的方式实现,但是可以通过COM互操作(需要注册)从VBA访问.NET DLL。 - Thorsten Dittmar

0

在这里检查P/Invoke,该文章包含一个有用的表格,介绍如何将托管类型翻译为非托管类型,提供了C#的简短代码示例、技巧和资源列表。

必备P/Invoke


2
如果他想从C#访问未托管的DLL,P/Invoke会很有用。但他想走另一条路。在VBA中没有P/Invoke这样的东西。 - Thorsten Dittmar

-1

C# Dll 不能导出可被其他非 CLR 代码调用的函数。

这是不可能的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接