Excel 2010 64 bit لا يمكن إنشاء كائن .NET
-
02-10-2019 - |
سؤال
لدي مكتبة صف بسيطة أستخدمها في Excel. هذا تبسيط لصفتي ...
using System;
using System.Runtime.InteropServices;
namespace SimpleLibrary
{
[ComVisible(true)]
public interface ISixGenerator
{
int Six();
}
public class SixGenerator : ISixGenerator
{
public int Six()
{
return 6;
}
}
}
في Excel 2007 ، سأقوم بإنشاء مصنف مكون من الماكرو وإضافة وحدة نمطية مع الكود التالي:
Public Function GetSix()
Dim lib As SimpleLibrary.SixGenerator
lib = New SimpleLibrary.SixGenerator
Six = lib.Six
End Function
ثم في Excel يمكنني الاتصال بالوظيفة GetSix () وسيعود ستة. هذا لم يعد يعمل في Excel 2010 64bit. أحصل على خطأ في وقت التشغيل "429": لا يمكن لمكون ActiveX إنشاء كائن.
لقد حاولت تغيير هدف النظام الأساسي إلى X64 بدلاً من أي وحدة المعالجة المركزية ، ولكن بعد ذلك لن يتم تجميع الكود الخاص بي إلا إذا قمت بإلغاء تحديد خيار التسجيل لـ COM Interop ، فإن القيام بذلك يجعله حتى لا يمكن لماكرو المصنف الماكرو رؤية simplelibrary.dll لأنه لم يعد يتم تسجيله .
أي أفكار كيف يمكنني استخدام مكتبتي مع Excel 2010 64 Bit؟
المحلول
لم تقم بالتفصيل بالتفصيل كيف أنشأت مجموعة .NET الخاصة بك. ومع ذلك ، هناك عدد معين من الخطوات المطلوبة لفضح التجميع إلى com:
أضف السمات التالية إلى الكود الخاص بك:
using System; using System.Runtime.InteropServices; namespace SimpleLibrary { [ComVisible(true)] [Guid("71F645D0-AA78-4447-BA26-3A2443FDA691")] public interface ISixGenerator { int Six(); } [ComVisible(true)] [ProgId("SimpleLibrary.SixGenerator")] [Guid("8D59E0F6-4AE3-4A6C-A4D9-DFE06EC5A514")] [ClassInterface(ClassInterfaceType.AutoDispatch)] public class SixGenerator : ISixGenerator { [DispId(1)] public int Six() { return 6; } } }
يجب توقيع التجميع الخاص بك (المشروع -> الخصائص ... -> التوقيع, ، قم بإنشاء ملف مفتاح قوي وتحديد المربع للتوقيع على التجميع
الأمر التالي ضروري لتسجيل التجميع (كل ذلك في سطر واحد):
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe SimpleLibrary.dll /tlb SimpleLibrary.tlb /codebase
هذا ينشئ ملف مكتبة نوع tlb الذي سيتعين عليك الإشارة إليه من مشروع VBA الخاص بك (أدوات -> المراجع -> تصفح ... في محرر VBA الخاص بك)
اضبط رمز VBA:
Public Function GetSix() Dim lib As SimpleLibrary.SixGenerator Set lib = New SimpleLibrary.SixGenerator GetSix = lib.Six End Function
ستجد الخطوات الموضحة بمزيد من التفصيل في هذه المقالة حول قاعدة بيانات دعم Microsoft:
كيفية استدعاء مجموعة Visual Basic .NET أو Visual Basic 2005 من Visual Basic 6.0