如何从C调用VB.NET DLL(也调用函数 – 不仅仅是DLL文件)
作者:互联网
我想问一下如何从C程序调用VB.NET DLL的问题
我已经多次尝试从C调用VB.NET DLL文件,它工作正常,但问题是我无法调用VB.NET DLL文件的功能(我只能加载VB.NET DLL文件)
在VB.NET DLL中我有以下代码:
Public Function example_function1(ByVal i As Integer) As Integer
Return 3
End Function
Public Function example_function2(ByVal i As Integer) As Integer
Return 3
End Function
============================
我的C代码是:
typedef int (__stdcall *ptf_test_func_1_type)(int);
typedef int (__stdcall *ptf_test_func_2_type)(int*);
int i =1;
HINSTANCE dll_instance = LoadLibrary("DLLs7.dll");
int main()
{
if(dll_instance !=NULL)
{
printf("The DLLs file has been Loaded \n");
cout << GetLastError() << endl;
ptf_test_func_1_type p_func1=(ptf_test_func_1_type)GetProcAddress(dll_instance,"Class1::example_function1");
ptf_test_func_2_type p_func2=(ptf_test_func_2_type)GetProcAddress(dll_instance,"Class1::example_function2");
// Function No 1 //
if (p_func1 != NULL)
{
cout << "\nThe function number 1 is " << p_func1(i) << endl;
}
else
{
cout << "\nFailed" << endl;
cout << GetLastError() << endl;
}
// Function No 2 //
if (p_func2 != NULL)
{
cout << "\nThe function number 2 is" << p_func2(&i) << endl;
}
else
{
cout << "\nFailed" << endl;
cout << GetLastError() << endl;
}
}
else
{
printf("\nDLLs file Load Error");
cout << GetLastError() << endl;
}
cout << GetLastError() << endl;
return(0);
}
我的以下步骤是:
1)我创建了VB.NET DLL.
2)我创建了一个新的应用程序visual C并选择了“win32控制台应用程序”
3)我已编写代码来调用DLL和函数(如上所示)
我错过了步骤或代码中的任何内容,因为我可以调用VB.NET DLL文件,但我无法调用VB.NET DLL函数
正如你所看到的,我写了GETLASTERRIR()来找到错误
cout<< GetLastError()<< ENDL; 但我发现失败时函数中的错误127和调用DLL文件中的203 谁能帮我 非常感谢你 问候
解决方法:
由于您的vb程序集需要与“本机”可执行文件完全不同的运行时,因此您需要在它们之间使用一些层.该层可以是COM.
您可以通过它的“ComVisible”属性将程序集公开给COM子系统.然后,您应该注册程序集以将其公开给COM’订阅者’.
只有这样你才能从你的c代码#import程序集命名空间.
注意:这是msdn文章“How to call a managed DLL from native Visual C++ code”的一个非常简短的版本
编辑 – 刚试了一下……似乎工作正常:
C#代码
namespace Adder
{
public interface IAdder
{
double add(double a1, double a2);
}
public class Adder : IAdder
{
public Adder() { }
public double add(double a1, double a2) { return a1 + a2; }
}
}
项目设置
[assembly: ComVisible(true)]
[assembly: AssemblyDelaySign(false)]
(需要签名才能生成tlb)
C代码:
#import <adder.tlb> raw_interfaces_only
CoInitialize(NULL);
Adder::IAdderPtr a;
a.CreateInstance( __uuidof( Adder::Adder ) );
double d = 0;
a->add(1.,1., &d);
// note: the method will return a HRESULT;
// the output is stored in a reference variable.
CoUninitialize();
标签:c-3,visual-c-2008,c,visual-c,visual-studio-2008 来源: https://codeday.me/bug/20191007/1866017.html