通过 COM 和 SXS 将 .NET 程序集与 fox-pro 应用程序进行免注册激活





5.00/5 (1投票)
将 .NET 程序集 xcopy 部署到 fox-pro 应用程序的逐步过程
引言
逐步说明如何通过 COM、SXS 和 CLR 实现 .NET 程序集与 fox-pro 应用程序的免注册激活。
使用代码
步骤 1 - 创建 .NET 程序集作为 COM 服务器
- 创建一个 .NET 类并包含命名空间
System.Runtime.InteropServices;
- 为该类生成并应用一个 guid 属性。 我没有应用
ClassInterfaceType
属性,因为默认值是AutoDispatch
。 如果您想通过该类显式实现的接口来公开功能,可以将ClassInterfaceType
更改为 none。
using System.Runtime.InteropServices;
namespace Netnamespace
{
[Guid("503322EE-482A-442F-8984-4FC3FDC53A0C")]
public class NetClass
{
public string NetMethod(string input)
{
//Implement the logic here..
}
}
}
步骤 2 - 签署 .NET 程序集
为了实现免注册互操作性,必须使用强名称签署程序集。 因此,在命令提示符中执行命令 sn -k keypair.snk 生成密钥对。 编辑 AssemblyInfo.cs 中的以下程序集属性并构建项目。
//Enable the com visibility [assembly: ComVisible(true)] Note - This attribute can be applied on specific methods to avoid exposing entire assembly. //Point the keypair file for signing the assembly [assembly: AssemblyKeyFileAttribute("..\\..\\keypair.snk")] Note - Use the absolute or relative path to locate the .snk file. //Generate and apply a guid attribute for the type library [assembly: Guid("A67D75D0-7AE7-434F-8A41-2C1E0B48ADF3")]
步骤 3 - 将 Sxs 清单嵌入到 .NET 程序集中
.NET 程序集必须有一个 SxS 清单,用于描述 COM 注册信息。 在您的项目中添加一个清单文件,并按如下方式输入程序集标识。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type="win32" name="<Assembly name>" version="<Assembly version>" publicKeyToken="<Assembly PublicKey Token>" /> <clrClass clsid="<GUID applied over the .Net class>" progid="<namespace.classname>" threadingModel="Both" name="<namespace.classname>" runtimeVersion="<CLR Version>" > </clrClass> </assembly>
下载 GenMan32.zip 并解压 GenMan32.exe。 在命令提示符中执行以下命令以嵌入清单。
genman32.exe "..\bin\Release\assemblyname.dll" /add /manifest:"..\assemblyname.dll.manifest"
注意 - 根据您的项目更改相对路径,或在命令中使用绝对路径。
步骤 4 - 为 foxpro 应用程序(COM 客户端)创建外部清单
下载 projecthookex.zip 并解压 projecthookex.vct。 通过 fox-pro 编辑 getdefaultmanifest
的 moduleresourceeditor 方法,如下所示。 然后将已编辑的 projecthookex.vct 作为项目类挂接到 fox-pro 的项目信息中。 项目类仅在关闭并重新打开 fox-pro 应用程序后应用。 构建 fox-pro 应用程序将生成一个外部清单。
LOCAL lcReturn *!* The following is the default manifest in a compiled VFP app TEXT TO m.lcReturn textmerge noshow
<?xml version="1.0" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="9.0.0.0"
type="win32"
name="<Foxpro EXE Name>"
processorArchitecture="x86"
/>
<description><Description about Foxpro EXE></description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
language="*"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
/>
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="<.Net Assembly name>"
version="<.Net Assembly version>"
publicKeyToken="<.Net Assembly publickey token>"
/>
</dependentAssembly>
</dependency>
</assembly>
ENDTEXT RETURN (m.lcReturn)
步骤 5:从 foxpro 应用程序(COM 客户端)调用 .Net 类
objVFP = CreateObject("<progId>") lresult = objVFP.NetMethod("")
注意 - 在 .NET 程序集清单中配置了 progid。
步骤 6 - SXS 跟踪以跟踪 COM 激活错误
如果由于清单中的配置无效而导致 COM 激活失败,则 fox-pro 应用程序启动时会显示以下错误。
“应用程序因其并行配置不正确而无法启动。请参阅应用程序事件日志或使用命令行 sxstrace.exe 工具了解更多详细信息”。
在命令提示符中执行以下命令以开始跟踪。
C:\Windows\System32>SxsTrace Trace -logfile:SxsTrace.etl
启动 foxpro 应用程序(COM 客户端)并执行事件以触发 .NET 程序集的激活。 在命令提示符中停止跟踪。
执行以下命令以输出错误
C:\Windows\System32>SxsTrace Parse -logfile:SxsTrace.etl -outfile:SxsTrace.txt
在 C:\Windows\System32 中找到生成的 SxsTrace.txt,解释清单的无效配置。
参考链接
- https://blogs.msdn.microsoft.com/junfeng/2006/05/17/registration-free-com-net-interop/
- https://docs.microsoft.com/en-us/dotnet/framework/app-domains/how-to-create-a-public-private-key-pair
- http://jwbs-blog.blogspot.my/2009/06/registration-free-com-components_16.html
- http://www.sweetpotatosoftware.com/blog/index.php/2009/08/03/apply-application-manifest-at-compile-time-with-projecthook/
关注点
SxsTrace 工具对于跟踪 COM 激活问题非常有用。
历史
- 2018 年 1 月 25 日 - 创建了本文。
- 2018 年 1 月 27 日 - 更新了许可证并格式化了 xml 内容。