2011-01-09 82 views
13

我有一个简单的任务:如何在Delphi中使用.Net程序集而不注册到GAC或COM中?

是有可能写出一个Delphi DLL,并把.NET程序集(用4种方法和一个类实现该接口只有一个接口),除了它并从德尔福DLL调用它?

我的意思是,如果我为tlb创建一个tlb和一个delphi单元,而无需注册Assembly/tlb,我可以直接从.Net程序集(相对文件名)中导入.Net类型吗?

最好, thalm

EDIT(我发现):

大多数解决方案必须至少注册一个DLL/TLB的COM。但我发现,最有前途的事情是:Unmanaged Exports罗伯特捷,它的Visual Studio项目模板,它可以让你写静态C#(或其他.NET语言)的方法,并从任何非托管的语言给他们打电话,真棒:

class Test 
{ 
    [DllExport("add", CallingConvention = CallingConvention.StdCall)] 
    public static int Add(int left, int right) 
    { 
     return left + right; 
    } 
} 

编辑2: 它真的有用!你甚至可以控制类型编组,不可信!

+1

不错的破解发现+1。它几乎立即有意义,一旦记住.Net标头只是COFF格式的扩展。我有一个伟大的文章与.Net位置的细节,但现在找不到它。这可能是更好的(而不是更简单的)方法:http://www.codeproject.com/KB/cs/unmanagedtomanaged.aspx – user44298 2011-01-10 15:58:22

回答

5

一条小建议:您不必公开您的出口。

你的班级已经在内部了,所以当它从另一个组件中消耗时它不会显示出来。

但是,将导出添加到现有的静态类也是完全正确的,但将其声明为私有,以便在从.Net中使用时不会显示出来。 (非托管的出口往往看起来有点令人毛骨悚然)

0

你可以使用注册免费COM来做到这一点。查看我对免费注册com here的问题的回答。使用.NET程序集,您需要使您的接口和方法COMVisible,就像您要使用注册的COM使用该对象一样。如果你就我刚才提到的问题回答我的回答,你应该可以并排放置dll。唯一的区别是您需要将信息放入程序集清单(托管程序清单)中,以了解您要导出的COM类。如果您查看关于应用程序和汇编清单的Microsoft网站上的文档,您应该了解如何执行此操作。您正在查找的清单属性是CLRClass。如果你已经正确设置了所有的东西,你只需将托管dll与调用可执行文件并排放置,并且一切正常。