我想从Inno Setup脚本调用. NET DLL(用C#编写)中的函数。
我有:
1.在项目属性中标记了 * 注册COM互操作 * 选项,
1.更改了AssemblyInfo.cs
文件中的ComVisible
设置,
1.已将以下行添加到ISS脚本:
[Files]
Source: c:\temp\1\MyDLL.dll; Flags: dontcopy
[Code]
function MyFunction(): string;
external 'MyFunction@files:MyDLL.dll stdcall setuponly';
但我仍然得到以下错误:
运行时错误(在-1:0):
无法导入动态链接库:C:\文档~1\foo\LOCALS~1\临时文件\is-LRL3E.tmp\我的DLL.dll。
我哪里做错了?
7条答案
按热度按时间lztngnrs1#
Intenta de esta manera(尝试这种方式):
Suerte(好运)
nx7onnlm2#
哎呀,我的错,我已经很久没有读过pascal了!所以,如果你需要得到这个值,那么有几种可能性:
1.用C/C编写函数并导出函数,这是绝对支持的。
1.使用托管C dll填充到.NET dll,并将调用公开为C接口点(这应该可以,但会变得很混乱)
1.使用.exe将代码的结果存储在.INI文件或注册表或临时文件中,并在安装代码部分读取结果(这现在相当令人讨厌)
当我上次使用InnoSetup时,它不直接支持您的场景(从安装程序调用.NET代码)。
wnrlj8wa3#
我读了一些关于它的东西-现在我可以看到导入C风格函数和创建OLE对象之间的区别了。
像这样的事情对我来说很有用:
但需要注册DLL文件。
我想我必须创建一个命令行应用程序来调用DLL中的函数。
iih3973s4#
使用Unmanaged Exports library从C#程序集中导出函数,以便可以在Inno Setup中调用该函数。
DllExport
属性添加到方法中在Inno设置端:
现在你可以像这样使用你的函数:
另见:
vfwfrxfs5#
您正在尝试从.NET dll导入一个C风格的函数-这实际上与COM互操作没有任何关系。COM互操作允许您将.NET对象作为COM对象激活,它不会将它们作为C/C++导出函数/类型公开。
如果你的函数不需要返回任何数据,为什么不创建一个简单的.exe来调用你的函数,然后从你的设置中运行它呢?
另外:请参阅innosetup support newsgroups,在那里您可能会获得更好的支持。
dffbzjpn6#
通过将.NET dll公开为COM对象,可以最好地从任何其他编程语言调用它。请看以下示例:http://support.microsoft.com/kb/828736。这展示了如何从“非托管C++"调用“.NET dll”。您可以用任何其他编程语言替换“未修改的C++”,它可以用作COM客户端。
xmd2e60i7#
尝试使用delayload,它用于运行时可能不存在的dll。这样可以解决问题。
例如: