0

我正在尝试为 VB6 DLL 创建一个 C# 包装器 DLL,然后在网页中将该包装器用作 ActiveXObject,但在调用 ClassTesting() 时出现此错误:

无法在 DLL 'VB6DLL' 中找到名为 'ClassTest' 的入口点。

应用程序将 DLL 导出到临时目录,然后将其加载到内存中。DLL的结构可以描述为:

VB6DLL.dll -> 公共类“VB6.cls” -> 公共函数“ClassTest()”。

C#代码如下:

namespace SystemDeviceDriver
{
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IDeviceDriver
    {
        [DispId(1)]
        string ClassTesting();
    }

    [Guid("655EE123-0996-4c70-B6BD-7CA8849799C7")]
    [ComSourceInterfaces(typeof(IDeviceDriver))]
    public class DeviceDriver : IDeviceDriver
    {

        [DllImport("kernel32", CharSet = CharSet.Unicode)]
        static extern IntPtr LoadLibrary(string lpFileName);

        [DllImport("VB6DLL", CharSet = CharSet.Unicode)]
        static extern string ClassTest();

        public DeviceDriver()
        {
            //Write the VB6DLL to a temp directory
            string dirName = Path.Combine(Path.GetTempPath(), "SystemDeviceDriver." + Assembly.GetExecutingAssembly().GetName().Version.ToString());
            if (!Directory.Exists(dirName))
            {
                Directory.CreateDirectory(dirName);
            }
            string dllPath = Path.Combine(dirName, "VB6DLL.dll");
            File.WriteAllBytes(dllPath, SystemDeviceDriver.Properties.Resources.VB6DLL);

            //Load the library into memory
            IntPtr h = LoadLibrary(dllPath);
            Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);
        }

        public string ClassTesting()
        {
            return ClassTest();
        }
    }
}
4

1 回答 1

3

DllImport / P/Invoke 函数用于包含“旧 C 风格”的 dll 文件,因此从库中导出的简单函数

以下是列出的调用方法,可能的函数类型:http: //msdn.microsoft.com/de-de/library/system.runtime.interopservices.callingconvention.aspx

COM 完全不同,参见:http ://en.wikipedia.org/wiki/Component_Object_Model

COM dll 通常导出的唯一函数是 DllRegisterServer、DllUnregisterServer,您可以首先使用 P/Invoke 函数来调用该函数。COM dll 文件在注册表中注册自己。那么应该可以创建一个 COM 对象。

于 2012-04-26T23:54:43.533 回答