2012-11-21 70 views
5

我想用C#,它可以从VBA以下方式再打电话来创建一个DLL -如何使用C#创建非托管DLL?

Private Declare Function invokePath Lib "\\shared_computer\Projects\somedll\myDLL.dll" (ByVal strUName As String, ByVal strSFile As String) As String 

的想法是,如果DLL的路径改变了我只需要更新的路径在私人声明函数行....

我寻觅了很多关于它,也不能肯定这个安排是否是可能的 - 我们可以称之为从网络路径的DLL函数没有引用或登记。

回答

3

不能创建与C#托管DLL,如C#是一个.NET唯一的语言。使用C++。

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

+0

虽然他在标题中声明了“非托管”,但问题主体中的请求(即创建一个从VBA调用的C#DLL)可以很好地实现。 –

+2

是的,但正如您注意到的,我没有说从VBA访问.NET DLL是不可能的。但是,问题是“如何在C#中创建非托管DLL” - 这是不可能的。 –

+0

这样是有可能访问使用私人声明函数invokePath库在C#创建的DLL“\\ shared_computer \项目\ somedll \ MYDLL.DLL”(BYVAL strUName作为字符串,BYVAL strSFile作为字符串)作为字符串,并且不添加作为参考?要求是保持路径灵活。如果不可能,我们必须切换到C++。 –

0

检查的P/Invoke在这里,本文包含如何翻译托管到非托管类型,短代码示例(在C#),提示和资源列表的有用的表。

Essential P/Invoke

+2

如果他想从C#访问非托管DLL,P/Invoke会很有用。但他想走另一条路。在VBA中没有P/Invoke这样的事情。 –

0

C#DLL不能导出可以通过任何其它非CLR代码中调用的函数。

这是不可能的。

10

其实你可以。 退房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); 
+0

这是否可以在没有.NET的地方运行后生成它? – qakmak

+0

是的,我曾经用这种方式构建dll,以便Delphi可以与它进行通信。 – Samball