gpt4 book ai didi

c# - 从 C# 动态调用非托管 VB COM dll 时遇到问题?

转载 作者:行者123 更新时间:2023-11-30 18:44:57 25 4
gpt4 key购买 nike

我在从 C# 调用非托管 VB COM dll 时遇到问题。这是使用 loadLibrary 和 GetProcAddress 的动态调用。

我可以使用 loadLibrary 成功加载 dll,但 GetProcAddress 始终返回 0。它没有记录任何错误消息,也没有记录任何内容。它只返回 0。

示例代码下方

VB 串口

VERSION 1.0 CLASS
BEGIN
MultiUse = -1
Persistable = 0
DataBindingBehavior = 0
DataSourceBehavior = 0
MTSTransactionMode = 0
END

Attribute VB_Name = "Sample"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True

Option Explicit

Private Attribute1 As String
Private Sub Class_Initialize()
Attribute1 = "test"
End Sub

Public Sub TestSub()

End Sub

Public Function testFunction() As String
testFunction = "default.html"
End Function

Public Function SetData(XML As String) As String
SetData = Date + Time
End Function

c#代码

static class UnManagedInvoker
{
[DllImport("kernel32.dll")]
private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string dllToLoad);

[DllImport("kernel32.dll")]
private static extern IntPtr GetProcAddress(IntPtr hModule, [MarshalAs(UnmanagedType.LPStr)] string procedureName);

[DllImport("kernel32.dll")]
private static extern bool FreeLibrary(IntPtr hModule);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate string MethodToInvoke(string sdata);

public static string InvokeUnmanagedDll(string dllPath, string methodName)
{
IntPtr DIedDll = LoadLibrary(dllPath);

IntPtr AddressOfFunction = GetProcAddress(DIedDll, methodName);

MethodToInvoke MI = (MethodToInvoke)Marshal.GetDelegateForFunctionPointer(AddressOfFunction, typeof(MethodToInvoke));

string data = MI("ssdasda");

FreeLibrary(DIedDll);
return data;

}
}

调用代码

 string res = UnManagedInvoker.InvokeUnmanagedDll("xx.dll","SetData");

谁能帮帮我..

更新:

如果组件已注册,我可以成功调用这些方法。使用下面的代码

Type Med = Type.GetTypeFromCLSID(new Guid("089DD8B0-E12B-439B-B52C-007CA72C93D0"));
object MedObj = Activator.CreateInstance(Med);
object[] parameter = new object[1];
parameter[0] = "asdasd";
var ss = Med.InvokeMember("SetData", System.Reflection.BindingFlags.InvokeMethod, null, MedObj, parameter);

如果dll没有注册,有什么办法吗?

最佳答案

请注意,GetProcAddress 和 COM 对象的概念是完全不同的技术。 VB6 旨在构建 COM 对象,并且(据我所知)无法通过 GetProcAddress API 导出代码。

此外,根据设计,COM 对象需要在某处注册,但是可以将此信息放在 list 文件中而不是注册表中。这意味着您可以只为您的应用程序注册您的 VB6 COM 类,而无需使用全局注册表。 (请注意, list 也可以嵌入到 .exe 中而不是文件。)

有关搜索“Registration free COM”的更多信息,这里有相应的链接 MSDN article .

关于c# - 从 C# 动态调用非托管 VB COM dll 时遇到问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1781601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com